Home | History | Annotate | Download | only in plugins
      1 // This file is part of Eigen, a lightweight C++ template library
      2 // for linear algebra.
      3 //
      4 // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud (at) inria.fr>
      5 // Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1 (at) gmail.com>
      6 //
      7 // This Source Code Form is subject to the terms of the Mozilla
      8 // Public License v. 2.0. If a copy of the MPL was not distributed
      9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
     10 
     11 
     12 #ifndef EIGEN_PARSED_BY_DOXYGEN
     13 
     14 /** \internal expression type of a column */
     15 typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, 1, !IsRowMajor> ColXpr;
     16 typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, 1, !IsRowMajor> ConstColXpr;
     17 /** \internal expression type of a row */
     18 typedef Block<Derived, 1, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> RowXpr;
     19 typedef const Block<const Derived, 1, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> ConstRowXpr;
     20 /** \internal expression type of a block of whole columns */
     21 typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, Dynamic, !IsRowMajor> ColsBlockXpr;
     22 typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, Dynamic, !IsRowMajor> ConstColsBlockXpr;
     23 /** \internal expression type of a block of whole rows */
     24 typedef Block<Derived, Dynamic, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> RowsBlockXpr;
     25 typedef const Block<const Derived, Dynamic, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> ConstRowsBlockXpr;
     26 /** \internal expression type of a block of whole columns */
     27 template<int N> struct NColsBlockXpr { typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type; };
     28 template<int N> struct ConstNColsBlockXpr { typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type; };
     29 /** \internal expression type of a block of whole rows */
     30 template<int N> struct NRowsBlockXpr { typedef Block<Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type; };
     31 template<int N> struct ConstNRowsBlockXpr { typedef const Block<const Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type; };
     32 
     33 typedef VectorBlock<Derived> SegmentReturnType;
     34 typedef const VectorBlock<const Derived> ConstSegmentReturnType;
     35 template<int Size> struct FixedSegmentReturnType { typedef VectorBlock<Derived, Size> Type; };
     36 template<int Size> struct ConstFixedSegmentReturnType { typedef const VectorBlock<const Derived, Size> Type; };
     37 
     38 #endif // not EIGEN_PARSED_BY_DOXYGEN
     39 
     40 /** \returns a dynamic-size expression of a block in *this.
     41   *
     42   * \param startRow the first row in the block
     43   * \param startCol the first column in the block
     44   * \param blockRows the number of rows in the block
     45   * \param blockCols the number of columns in the block
     46   *
     47   * Example: \include MatrixBase_block_int_int_int_int.cpp
     48   * Output: \verbinclude MatrixBase_block_int_int_int_int.out
     49   *
     50   * \note Even though the returned expression has dynamic size, in the case
     51   * when it is applied to a fixed-size matrix, it inherits a fixed maximal size,
     52   * which means that evaluating it does not cause a dynamic memory allocation.
     53   *
     54   * \sa class Block, block(Index,Index)
     55   */
     56 inline Block<Derived> block(Index startRow, Index startCol, Index blockRows, Index blockCols)
     57 {
     58   return Block<Derived>(derived(), startRow, startCol, blockRows, blockCols);
     59 }
     60 
     61 /** This is the const version of block(Index,Index,Index,Index). */
     62 inline const Block<const Derived> block(Index startRow, Index startCol, Index blockRows, Index blockCols) const
     63 {
     64   return Block<const Derived>(derived(), startRow, startCol, blockRows, blockCols);
     65 }
     66 
     67 
     68 
     69 
     70 /** \returns a dynamic-size expression of a top-right corner of *this.
     71   *
     72   * \param cRows the number of rows in the corner
     73   * \param cCols the number of columns in the corner
     74   *
     75   * Example: \include MatrixBase_topRightCorner_int_int.cpp
     76   * Output: \verbinclude MatrixBase_topRightCorner_int_int.out
     77   *
     78   * \sa class Block, block(Index,Index,Index,Index)
     79   */
     80 inline Block<Derived> topRightCorner(Index cRows, Index cCols)
     81 {
     82   return Block<Derived>(derived(), 0, cols() - cCols, cRows, cCols);
     83 }
     84 
     85 /** This is the const version of topRightCorner(Index, Index).*/
     86 inline const Block<const Derived> topRightCorner(Index cRows, Index cCols) const
     87 {
     88   return Block<const Derived>(derived(), 0, cols() - cCols, cRows, cCols);
     89 }
     90 
     91 /** \returns an expression of a fixed-size top-right corner of *this.
     92   *
     93   * \tparam CRows the number of rows in the corner
     94   * \tparam CCols the number of columns in the corner
     95   *
     96   * Example: \include MatrixBase_template_int_int_topRightCorner.cpp
     97   * Output: \verbinclude MatrixBase_template_int_int_topRightCorner.out
     98   *
     99   * \sa class Block, block<int,int>(Index,Index)
    100   */
    101 template<int CRows, int CCols>
    102 inline Block<Derived, CRows, CCols> topRightCorner()
    103 {
    104   return Block<Derived, CRows, CCols>(derived(), 0, cols() - CCols);
    105 }
    106 
    107 /** This is the const version of topRightCorner<int, int>().*/
    108 template<int CRows, int CCols>
    109 inline const Block<const Derived, CRows, CCols> topRightCorner() const
    110 {
    111   return Block<const Derived, CRows, CCols>(derived(), 0, cols() - CCols);
    112 }
    113 
    114 /** \returns an expression of a top-right corner of *this.
    115   *
    116   * \tparam CRows number of rows in corner as specified at compile-time
    117   * \tparam CCols number of columns in corner as specified at compile-time
    118   * \param  cRows number of rows in corner as specified at run-time
    119   * \param  cCols number of columns in corner as specified at run-time
    120   *
    121   * This function is mainly useful for corners where the number of rows is specified at compile-time
    122   * and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
    123   * information should not contradict. In other words, \a cRows should equal \a CRows unless
    124   * \a CRows is \a Dynamic, and the same for the number of columns.
    125   *
    126   * Example: \include MatrixBase_template_int_int_topRightCorner_int_int.cpp
    127   * Output: \verbinclude MatrixBase_template_int_int_topRightCorner_int_int.out
    128   *
    129   * \sa class Block
    130   */
    131 template<int CRows, int CCols>
    132 inline Block<Derived, CRows, CCols> topRightCorner(Index cRows, Index cCols)
    133 {
    134   return Block<Derived, CRows, CCols>(derived(), 0, cols() - cCols, cRows, cCols);
    135 }
    136 
    137 /** This is the const version of topRightCorner<int, int>(Index, Index).*/
    138 template<int CRows, int CCols>
    139 inline const Block<const Derived, CRows, CCols> topRightCorner(Index cRows, Index cCols) const
    140 {
    141   return Block<const Derived, CRows, CCols>(derived(), 0, cols() - cCols, cRows, cCols);
    142 }
    143 
    144 
    145 
    146 /** \returns a dynamic-size expression of a top-left corner of *this.
    147   *
    148   * \param cRows the number of rows in the corner
    149   * \param cCols the number of columns in the corner
    150   *
    151   * Example: \include MatrixBase_topLeftCorner_int_int.cpp
    152   * Output: \verbinclude MatrixBase_topLeftCorner_int_int.out
    153   *
    154   * \sa class Block, block(Index,Index,Index,Index)
    155   */
    156 inline Block<Derived> topLeftCorner(Index cRows, Index cCols)
    157 {
    158   return Block<Derived>(derived(), 0, 0, cRows, cCols);
    159 }
    160 
    161 /** This is the const version of topLeftCorner(Index, Index).*/
    162 inline const Block<const Derived> topLeftCorner(Index cRows, Index cCols) const
    163 {
    164   return Block<const Derived>(derived(), 0, 0, cRows, cCols);
    165 }
    166 
    167 /** \returns an expression of a fixed-size top-left corner of *this.
    168   *
    169   * The template parameters CRows and CCols are the number of rows and columns in the corner.
    170   *
    171   * Example: \include MatrixBase_template_int_int_topLeftCorner.cpp
    172   * Output: \verbinclude MatrixBase_template_int_int_topLeftCorner.out
    173   *
    174   * \sa class Block, block(Index,Index,Index,Index)
    175   */
    176 template<int CRows, int CCols>
    177 inline Block<Derived, CRows, CCols> topLeftCorner()
    178 {
    179   return Block<Derived, CRows, CCols>(derived(), 0, 0);
    180 }
    181 
    182 /** This is the const version of topLeftCorner<int, int>().*/
    183 template<int CRows, int CCols>
    184 inline const Block<const Derived, CRows, CCols> topLeftCorner() const
    185 {
    186   return Block<const Derived, CRows, CCols>(derived(), 0, 0);
    187 }
    188 
    189 /** \returns an expression of a top-left corner of *this.
    190   *
    191   * \tparam CRows number of rows in corner as specified at compile-time
    192   * \tparam CCols number of columns in corner as specified at compile-time
    193   * \param  cRows number of rows in corner as specified at run-time
    194   * \param  cCols number of columns in corner as specified at run-time
    195   *
    196   * This function is mainly useful for corners where the number of rows is specified at compile-time
    197   * and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
    198   * information should not contradict. In other words, \a cRows should equal \a CRows unless
    199   * \a CRows is \a Dynamic, and the same for the number of columns.
    200   *
    201   * Example: \include MatrixBase_template_int_int_topLeftCorner_int_int.cpp
    202   * Output: \verbinclude MatrixBase_template_int_int_topLeftCorner_int_int.out
    203   *
    204   * \sa class Block
    205   */
    206 template<int CRows, int CCols>
    207 inline Block<Derived, CRows, CCols> topLeftCorner(Index cRows, Index cCols)
    208 {
    209   return Block<Derived, CRows, CCols>(derived(), 0, 0, cRows, cCols);
    210 }
    211 
    212 /** This is the const version of topLeftCorner<int, int>(Index, Index).*/
    213 template<int CRows, int CCols>
    214 inline const Block<const Derived, CRows, CCols> topLeftCorner(Index cRows, Index cCols) const
    215 {
    216   return Block<const Derived, CRows, CCols>(derived(), 0, 0, cRows, cCols);
    217 }
    218 
    219 
    220 
    221 /** \returns a dynamic-size expression of a bottom-right corner of *this.
    222   *
    223   * \param cRows the number of rows in the corner
    224   * \param cCols the number of columns in the corner
    225   *
    226   * Example: \include MatrixBase_bottomRightCorner_int_int.cpp
    227   * Output: \verbinclude MatrixBase_bottomRightCorner_int_int.out
    228   *
    229   * \sa class Block, block(Index,Index,Index,Index)
    230   */
    231 inline Block<Derived> bottomRightCorner(Index cRows, Index cCols)
    232 {
    233   return Block<Derived>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
    234 }
    235 
    236 /** This is the const version of bottomRightCorner(Index, Index).*/
    237 inline const Block<const Derived> bottomRightCorner(Index cRows, Index cCols) const
    238 {
    239   return Block<const Derived>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
    240 }
    241 
    242 /** \returns an expression of a fixed-size bottom-right corner of *this.
    243   *
    244   * The template parameters CRows and CCols are the number of rows and columns in the corner.
    245   *
    246   * Example: \include MatrixBase_template_int_int_bottomRightCorner.cpp
    247   * Output: \verbinclude MatrixBase_template_int_int_bottomRightCorner.out
    248   *
    249   * \sa class Block, block(Index,Index,Index,Index)
    250   */
    251 template<int CRows, int CCols>
    252 inline Block<Derived, CRows, CCols> bottomRightCorner()
    253 {
    254   return Block<Derived, CRows, CCols>(derived(), rows() - CRows, cols() - CCols);
    255 }
    256 
    257 /** This is the const version of bottomRightCorner<int, int>().*/
    258 template<int CRows, int CCols>
    259 inline const Block<const Derived, CRows, CCols> bottomRightCorner() const
    260 {
    261   return Block<const Derived, CRows, CCols>(derived(), rows() - CRows, cols() - CCols);
    262 }
    263 
    264 /** \returns an expression of a bottom-right corner of *this.
    265   *
    266   * \tparam CRows number of rows in corner as specified at compile-time
    267   * \tparam CCols number of columns in corner as specified at compile-time
    268   * \param  cRows number of rows in corner as specified at run-time
    269   * \param  cCols number of columns in corner as specified at run-time
    270   *
    271   * This function is mainly useful for corners where the number of rows is specified at compile-time
    272   * and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
    273   * information should not contradict. In other words, \a cRows should equal \a CRows unless
    274   * \a CRows is \a Dynamic, and the same for the number of columns.
    275   *
    276   * Example: \include MatrixBase_template_int_int_bottomRightCorner_int_int.cpp
    277   * Output: \verbinclude MatrixBase_template_int_int_bottomRightCorner_int_int.out
    278   *
    279   * \sa class Block
    280   */
    281 template<int CRows, int CCols>
    282 inline Block<Derived, CRows, CCols> bottomRightCorner(Index cRows, Index cCols)
    283 {
    284   return Block<Derived, CRows, CCols>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
    285 }
    286 
    287 /** This is the const version of bottomRightCorner<int, int>(Index, Index).*/
    288 template<int CRows, int CCols>
    289 inline const Block<const Derived, CRows, CCols> bottomRightCorner(Index cRows, Index cCols) const
    290 {
    291   return Block<const Derived, CRows, CCols>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
    292 }
    293 
    294 
    295 
    296 /** \returns a dynamic-size expression of a bottom-left corner of *this.
    297   *
    298   * \param cRows the number of rows in the corner
    299   * \param cCols the number of columns in the corner
    300   *
    301   * Example: \include MatrixBase_bottomLeftCorner_int_int.cpp
    302   * Output: \verbinclude MatrixBase_bottomLeftCorner_int_int.out
    303   *
    304   * \sa class Block, block(Index,Index,Index,Index)
    305   */
    306 inline Block<Derived> bottomLeftCorner(Index cRows, Index cCols)
    307 {
    308   return Block<Derived>(derived(), rows() - cRows, 0, cRows, cCols);
    309 }
    310 
    311 /** This is the const version of bottomLeftCorner(Index, Index).*/
    312 inline const Block<const Derived> bottomLeftCorner(Index cRows, Index cCols) const
    313 {
    314   return Block<const Derived>(derived(), rows() - cRows, 0, cRows, cCols);
    315 }
    316 
    317 /** \returns an expression of a fixed-size bottom-left corner of *this.
    318   *
    319   * The template parameters CRows and CCols are the number of rows and columns in the corner.
    320   *
    321   * Example: \include MatrixBase_template_int_int_bottomLeftCorner.cpp
    322   * Output: \verbinclude MatrixBase_template_int_int_bottomLeftCorner.out
    323   *
    324   * \sa class Block, block(Index,Index,Index,Index)
    325   */
    326 template<int CRows, int CCols>
    327 inline Block<Derived, CRows, CCols> bottomLeftCorner()
    328 {
    329   return Block<Derived, CRows, CCols>(derived(), rows() - CRows, 0);
    330 }
    331 
    332 /** This is the const version of bottomLeftCorner<int, int>().*/
    333 template<int CRows, int CCols>
    334 inline const Block<const Derived, CRows, CCols> bottomLeftCorner() const
    335 {
    336   return Block<const Derived, CRows, CCols>(derived(), rows() - CRows, 0);
    337 }
    338 
    339 /** \returns an expression of a bottom-left corner of *this.
    340   *
    341   * \tparam CRows number of rows in corner as specified at compile-time
    342   * \tparam CCols number of columns in corner as specified at compile-time
    343   * \param  cRows number of rows in corner as specified at run-time
    344   * \param  cCols number of columns in corner as specified at run-time
    345   *
    346   * This function is mainly useful for corners where the number of rows is specified at compile-time
    347   * and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
    348   * information should not contradict. In other words, \a cRows should equal \a CRows unless
    349   * \a CRows is \a Dynamic, and the same for the number of columns.
    350   *
    351   * Example: \include MatrixBase_template_int_int_bottomLeftCorner_int_int.cpp
    352   * Output: \verbinclude MatrixBase_template_int_int_bottomLeftCorner_int_int.out
    353   *
    354   * \sa class Block
    355   */
    356 template<int CRows, int CCols>
    357 inline Block<Derived, CRows, CCols> bottomLeftCorner(Index cRows, Index cCols)
    358 {
    359   return Block<Derived, CRows, CCols>(derived(), rows() - cRows, 0, cRows, cCols);
    360 }
    361 
    362 /** This is the const version of bottomLeftCorner<int, int>(Index, Index).*/
    363 template<int CRows, int CCols>
    364 inline const Block<const Derived, CRows, CCols> bottomLeftCorner(Index cRows, Index cCols) const
    365 {
    366   return Block<const Derived, CRows, CCols>(derived(), rows() - cRows, 0, cRows, cCols);
    367 }
    368 
    369 
    370 
    371 /** \returns a block consisting of the top rows of *this.
    372   *
    373   * \param n the number of rows in the block
    374   *
    375   * Example: \include MatrixBase_topRows_int.cpp
    376   * Output: \verbinclude MatrixBase_topRows_int.out
    377   *
    378   * \sa class Block, block(Index,Index,Index,Index)
    379   */
    380 inline RowsBlockXpr topRows(Index n)
    381 {
    382   return RowsBlockXpr(derived(), 0, 0, n, cols());
    383 }
    384 
    385 /** This is the const version of topRows(Index).*/
    386 inline ConstRowsBlockXpr topRows(Index n) const
    387 {
    388   return ConstRowsBlockXpr(derived(), 0, 0, n, cols());
    389 }
    390 
    391 /** \returns a block consisting of the top rows of *this.
    392   *
    393   * \tparam N the number of rows in the block as specified at compile-time
    394   * \param n the number of rows in the block as specified at run-time
    395   *
    396   * The compile-time and run-time information should not contradict. In other words,
    397   * \a n should equal \a N unless \a N is \a Dynamic.
    398   *
    399   * Example: \include MatrixBase_template_int_topRows.cpp
    400   * Output: \verbinclude MatrixBase_template_int_topRows.out
    401   *
    402   * \sa class Block, block(Index,Index,Index,Index)
    403   */
    404 template<int N>
    405 inline typename NRowsBlockXpr<N>::Type topRows(Index n = N)
    406 {
    407   return typename NRowsBlockXpr<N>::Type(derived(), 0, 0, n, cols());
    408 }
    409 
    410 /** This is the const version of topRows<int>().*/
    411 template<int N>
    412 inline typename ConstNRowsBlockXpr<N>::Type topRows(Index n = N) const
    413 {
    414   return typename ConstNRowsBlockXpr<N>::Type(derived(), 0, 0, n, cols());
    415 }
    416 
    417 
    418 
    419 /** \returns a block consisting of the bottom rows of *this.
    420   *
    421   * \param n the number of rows in the block
    422   *
    423   * Example: \include MatrixBase_bottomRows_int.cpp
    424   * Output: \verbinclude MatrixBase_bottomRows_int.out
    425   *
    426   * \sa class Block, block(Index,Index,Index,Index)
    427   */
    428 inline RowsBlockXpr bottomRows(Index n)
    429 {
    430   return RowsBlockXpr(derived(), rows() - n, 0, n, cols());
    431 }
    432 
    433 /** This is the const version of bottomRows(Index).*/
    434 inline ConstRowsBlockXpr bottomRows(Index n) const
    435 {
    436   return ConstRowsBlockXpr(derived(), rows() - n, 0, n, cols());
    437 }
    438 
    439 /** \returns a block consisting of the bottom rows of *this.
    440   *
    441   * \tparam N the number of rows in the block as specified at compile-time
    442   * \param n the number of rows in the block as specified at run-time
    443   *
    444   * The compile-time and run-time information should not contradict. In other words,
    445   * \a n should equal \a N unless \a N is \a Dynamic.
    446   *
    447   * Example: \include MatrixBase_template_int_bottomRows.cpp
    448   * Output: \verbinclude MatrixBase_template_int_bottomRows.out
    449   *
    450   * \sa class Block, block(Index,Index,Index,Index)
    451   */
    452 template<int N>
    453 inline typename NRowsBlockXpr<N>::Type bottomRows(Index n = N)
    454 {
    455   return typename NRowsBlockXpr<N>::Type(derived(), rows() - n, 0, n, cols());
    456 }
    457 
    458 /** This is the const version of bottomRows<int>().*/
    459 template<int N>
    460 inline typename ConstNRowsBlockXpr<N>::Type bottomRows(Index n = N) const
    461 {
    462   return typename ConstNRowsBlockXpr<N>::Type(derived(), rows() - n, 0, n, cols());
    463 }
    464 
    465 
    466 
    467 /** \returns a block consisting of a range of rows of *this.
    468   *
    469   * \param startRow the index of the first row in the block
    470   * \param n the number of rows in the block
    471   *
    472   * Example: \include DenseBase_middleRows_int.cpp
    473   * Output: \verbinclude DenseBase_middleRows_int.out
    474   *
    475   * \sa class Block, block(Index,Index,Index,Index)
    476   */
    477 inline RowsBlockXpr middleRows(Index startRow, Index n)
    478 {
    479   return RowsBlockXpr(derived(), startRow, 0, n, cols());
    480 }
    481 
    482 /** This is the const version of middleRows(Index,Index).*/
    483 inline ConstRowsBlockXpr middleRows(Index startRow, Index n) const
    484 {
    485   return ConstRowsBlockXpr(derived(), startRow, 0, n, cols());
    486 }
    487 
    488 /** \returns a block consisting of a range of rows of *this.
    489   *
    490   * \tparam N the number of rows in the block as specified at compile-time
    491   * \param startRow the index of the first row in the block
    492   * \param n the number of rows in the block as specified at run-time
    493   *
    494   * The compile-time and run-time information should not contradict. In other words,
    495   * \a n should equal \a N unless \a N is \a Dynamic.
    496   *
    497   * Example: \include DenseBase_template_int_middleRows.cpp
    498   * Output: \verbinclude DenseBase_template_int_middleRows.out
    499   *
    500   * \sa class Block, block(Index,Index,Index,Index)
    501   */
    502 template<int N>
    503 inline typename NRowsBlockXpr<N>::Type middleRows(Index startRow, Index n = N)
    504 {
    505   return typename NRowsBlockXpr<N>::Type(derived(), startRow, 0, n, cols());
    506 }
    507 
    508 /** This is the const version of middleRows<int>().*/
    509 template<int N>
    510 inline typename ConstNRowsBlockXpr<N>::Type middleRows(Index startRow, Index n = N) const
    511 {
    512   return typename ConstNRowsBlockXpr<N>::Type(derived(), startRow, 0, n, cols());
    513 }
    514 
    515 
    516 
    517 /** \returns a block consisting of the left columns of *this.
    518   *
    519   * \param n the number of columns in the block
    520   *
    521   * Example: \include MatrixBase_leftCols_int.cpp
    522   * Output: \verbinclude MatrixBase_leftCols_int.out
    523   *
    524   * \sa class Block, block(Index,Index,Index,Index)
    525   */
    526 inline ColsBlockXpr leftCols(Index n)
    527 {
    528   return ColsBlockXpr(derived(), 0, 0, rows(), n);
    529 }
    530 
    531 /** This is the const version of leftCols(Index).*/
    532 inline ConstColsBlockXpr leftCols(Index n) const
    533 {
    534   return ConstColsBlockXpr(derived(), 0, 0, rows(), n);
    535 }
    536 
    537 /** \returns a block consisting of the left columns of *this.
    538   *
    539   * \tparam N the number of columns in the block as specified at compile-time
    540   * \param n the number of columns in the block as specified at run-time
    541   *
    542   * The compile-time and run-time information should not contradict. In other words,
    543   * \a n should equal \a N unless \a N is \a Dynamic.
    544   *
    545   * Example: \include MatrixBase_template_int_leftCols.cpp
    546   * Output: \verbinclude MatrixBase_template_int_leftCols.out
    547   *
    548   * \sa class Block, block(Index,Index,Index,Index)
    549   */
    550 template<int N>
    551 inline typename NColsBlockXpr<N>::Type leftCols(Index n = N)
    552 {
    553   return typename NColsBlockXpr<N>::Type(derived(), 0, 0, rows(), n);
    554 }
    555 
    556 /** This is the const version of leftCols<int>().*/
    557 template<int N>
    558 inline typename ConstNColsBlockXpr<N>::Type leftCols(Index n = N) const
    559 {
    560   return typename ConstNColsBlockXpr<N>::Type(derived(), 0, 0, rows(), n);
    561 }
    562 
    563 
    564 
    565 /** \returns a block consisting of the right columns of *this.
    566   *
    567   * \param n the number of columns in the block
    568   *
    569   * Example: \include MatrixBase_rightCols_int.cpp
    570   * Output: \verbinclude MatrixBase_rightCols_int.out
    571   *
    572   * \sa class Block, block(Index,Index,Index,Index)
    573   */
    574 inline ColsBlockXpr rightCols(Index n)
    575 {
    576   return ColsBlockXpr(derived(), 0, cols() - n, rows(), n);
    577 }
    578 
    579 /** This is the const version of rightCols(Index).*/
    580 inline ConstColsBlockXpr rightCols(Index n) const
    581 {
    582   return ConstColsBlockXpr(derived(), 0, cols() - n, rows(), n);
    583 }
    584 
    585 /** \returns a block consisting of the right columns of *this.
    586   *
    587   * \tparam N the number of columns in the block as specified at compile-time
    588   * \param n the number of columns in the block as specified at run-time
    589   *
    590   * The compile-time and run-time information should not contradict. In other words,
    591   * \a n should equal \a N unless \a N is \a Dynamic.
    592   *
    593   * Example: \include MatrixBase_template_int_rightCols.cpp
    594   * Output: \verbinclude MatrixBase_template_int_rightCols.out
    595   *
    596   * \sa class Block, block(Index,Index,Index,Index)
    597   */
    598 template<int N>
    599 inline typename NColsBlockXpr<N>::Type rightCols(Index n = N)
    600 {
    601   return typename NColsBlockXpr<N>::Type(derived(), 0, cols() - n, rows(), n);
    602 }
    603 
    604 /** This is the const version of rightCols<int>().*/
    605 template<int N>
    606 inline typename ConstNColsBlockXpr<N>::Type rightCols(Index n = N) const
    607 {
    608   return typename ConstNColsBlockXpr<N>::Type(derived(), 0, cols() - n, rows(), n);
    609 }
    610 
    611 
    612 
    613 /** \returns a block consisting of a range of columns of *this.
    614   *
    615   * \param startCol the index of the first column in the block
    616   * \param numCols the number of columns in the block
    617   *
    618   * Example: \include DenseBase_middleCols_int.cpp
    619   * Output: \verbinclude DenseBase_middleCols_int.out
    620   *
    621   * \sa class Block, block(Index,Index,Index,Index)
    622   */
    623 inline ColsBlockXpr middleCols(Index startCol, Index numCols)
    624 {
    625   return ColsBlockXpr(derived(), 0, startCol, rows(), numCols);
    626 }
    627 
    628 /** This is the const version of middleCols(Index,Index).*/
    629 inline ConstColsBlockXpr middleCols(Index startCol, Index numCols) const
    630 {
    631   return ConstColsBlockXpr(derived(), 0, startCol, rows(), numCols);
    632 }
    633 
    634 /** \returns a block consisting of a range of columns of *this.
    635   *
    636   * \tparam N the number of columns in the block as specified at compile-time
    637   * \param startCol the index of the first column in the block
    638   * \param n the number of columns in the block as specified at run-time
    639   *
    640   * The compile-time and run-time information should not contradict. In other words,
    641   * \a n should equal \a N unless \a N is \a Dynamic.
    642   *
    643   * Example: \include DenseBase_template_int_middleCols.cpp
    644   * Output: \verbinclude DenseBase_template_int_middleCols.out
    645   *
    646   * \sa class Block, block(Index,Index,Index,Index)
    647   */
    648 template<int N>
    649 inline typename NColsBlockXpr<N>::Type middleCols(Index startCol, Index n = N)
    650 {
    651   return typename NColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), n);
    652 }
    653 
    654 /** This is the const version of middleCols<int>().*/
    655 template<int N>
    656 inline typename ConstNColsBlockXpr<N>::Type middleCols(Index startCol, Index n = N) const
    657 {
    658   return typename ConstNColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), n);
    659 }
    660 
    661 
    662 
    663 /** \returns a fixed-size expression of a block in *this.
    664   *
    665   * The template parameters \a BlockRows and \a BlockCols are the number of
    666   * rows and columns in the block.
    667   *
    668   * \param startRow the first row in the block
    669   * \param startCol the first column in the block
    670   *
    671   * Example: \include MatrixBase_block_int_int.cpp
    672   * Output: \verbinclude MatrixBase_block_int_int.out
    673   *
    674   * \note since block is a templated member, the keyword template has to be used
    675   * if the matrix type is also a template parameter: \code m.template block<3,3>(1,1); \endcode
    676   *
    677   * \sa class Block, block(Index,Index,Index,Index)
    678   */
    679 template<int BlockRows, int BlockCols>
    680 inline Block<Derived, BlockRows, BlockCols> block(Index startRow, Index startCol)
    681 {
    682   return Block<Derived, BlockRows, BlockCols>(derived(), startRow, startCol);
    683 }
    684 
    685 /** This is the const version of block<>(Index, Index). */
    686 template<int BlockRows, int BlockCols>
    687 inline const Block<const Derived, BlockRows, BlockCols> block(Index startRow, Index startCol) const
    688 {
    689   return Block<const Derived, BlockRows, BlockCols>(derived(), startRow, startCol);
    690 }
    691 
    692 /** \returns an expression of a block in *this.
    693   *
    694   * \tparam BlockRows number of rows in block as specified at compile-time
    695   * \tparam BlockCols number of columns in block as specified at compile-time
    696   * \param  startRow  the first row in the block
    697   * \param  startCol  the first column in the block
    698   * \param  blockRows number of rows in block as specified at run-time
    699   * \param  blockCols number of columns in block as specified at run-time
    700   *
    701   * This function is mainly useful for blocks where the number of rows is specified at compile-time
    702   * and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
    703   * information should not contradict. In other words, \a blockRows should equal \a BlockRows unless
    704   * \a BlockRows is \a Dynamic, and the same for the number of columns.
    705   *
    706   * Example: \include MatrixBase_template_int_int_block_int_int_int_int.cpp
    707   * Output: \verbinclude MatrixBase_template_int_int_block_int_int_int_int.cpp
    708   *
    709   * \sa class Block, block(Index,Index,Index,Index)
    710   */
    711 template<int BlockRows, int BlockCols>
    712 inline Block<Derived, BlockRows, BlockCols> block(Index startRow, Index startCol,
    713                                                   Index blockRows, Index blockCols)
    714 {
    715   return Block<Derived, BlockRows, BlockCols>(derived(), startRow, startCol, blockRows, blockCols);
    716 }
    717 
    718 /** This is the const version of block<>(Index, Index, Index, Index). */
    719 template<int BlockRows, int BlockCols>
    720 inline const Block<const Derived, BlockRows, BlockCols> block(Index startRow, Index startCol,
    721                                                               Index blockRows, Index blockCols) const
    722 {
    723   return Block<const Derived, BlockRows, BlockCols>(derived(), startRow, startCol, blockRows, blockCols);
    724 }
    725 
    726 /** \returns an expression of the \a i-th column of *this. Note that the numbering starts at 0.
    727   *
    728   * Example: \include MatrixBase_col.cpp
    729   * Output: \verbinclude MatrixBase_col.out
    730   *
    731   * \sa row(), class Block */
    732 inline ColXpr col(Index i)
    733 {
    734   return ColXpr(derived(), i);
    735 }
    736 
    737 /** This is the const version of col(). */
    738 inline ConstColXpr col(Index i) const
    739 {
    740   return ConstColXpr(derived(), i);
    741 }
    742 
    743 /** \returns an expression of the \a i-th row of *this. Note that the numbering starts at 0.
    744   *
    745   * Example: \include MatrixBase_row.cpp
    746   * Output: \verbinclude MatrixBase_row.out
    747   *
    748   * \sa col(), class Block */
    749 inline RowXpr row(Index i)
    750 {
    751   return RowXpr(derived(), i);
    752 }
    753 
    754 /** This is the const version of row(). */
    755 inline ConstRowXpr row(Index i) const
    756 {
    757   return ConstRowXpr(derived(), i);
    758 }
    759 
    760 /** \returns a dynamic-size expression of a segment (i.e. a vector block) in *this.
    761   *
    762   * \only_for_vectors
    763   *
    764   * \param start the first coefficient in the segment
    765   * \param n the number of coefficients in the segment
    766   *
    767   * Example: \include MatrixBase_segment_int_int.cpp
    768   * Output: \verbinclude MatrixBase_segment_int_int.out
    769   *
    770   * \note Even though the returned expression has dynamic size, in the case
    771   * when it is applied to a fixed-size vector, it inherits a fixed maximal size,
    772   * which means that evaluating it does not cause a dynamic memory allocation.
    773   *
    774   * \sa class Block, segment(Index)
    775   */
    776 inline SegmentReturnType segment(Index start, Index n)
    777 {
    778   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    779   return SegmentReturnType(derived(), start, n);
    780 }
    781 
    782 
    783 /** This is the const version of segment(Index,Index).*/
    784 inline ConstSegmentReturnType segment(Index start, Index n) const
    785 {
    786   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    787   return ConstSegmentReturnType(derived(), start, n);
    788 }
    789 
    790 /** \returns a dynamic-size expression of the first coefficients of *this.
    791   *
    792   * \only_for_vectors
    793   *
    794   * \param n the number of coefficients in the segment
    795   *
    796   * Example: \include MatrixBase_start_int.cpp
    797   * Output: \verbinclude MatrixBase_start_int.out
    798   *
    799   * \note Even though the returned expression has dynamic size, in the case
    800   * when it is applied to a fixed-size vector, it inherits a fixed maximal size,
    801   * which means that evaluating it does not cause a dynamic memory allocation.
    802   *
    803   * \sa class Block, block(Index,Index)
    804   */
    805 inline SegmentReturnType head(Index n)
    806 {
    807   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    808   return SegmentReturnType(derived(), 0, n);
    809 }
    810 
    811 /** This is the const version of head(Index).*/
    812 inline ConstSegmentReturnType head(Index n) const
    813 {
    814   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    815   return ConstSegmentReturnType(derived(), 0, n);
    816 }
    817 
    818 /** \returns a dynamic-size expression of the last coefficients of *this.
    819   *
    820   * \only_for_vectors
    821   *
    822   * \param n the number of coefficients in the segment
    823   *
    824   * Example: \include MatrixBase_end_int.cpp
    825   * Output: \verbinclude MatrixBase_end_int.out
    826   *
    827   * \note Even though the returned expression has dynamic size, in the case
    828   * when it is applied to a fixed-size vector, it inherits a fixed maximal size,
    829   * which means that evaluating it does not cause a dynamic memory allocation.
    830   *
    831   * \sa class Block, block(Index,Index)
    832   */
    833 inline SegmentReturnType tail(Index n)
    834 {
    835   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    836   return SegmentReturnType(derived(), this->size() - n, n);
    837 }
    838 
    839 /** This is the const version of tail(Index).*/
    840 inline ConstSegmentReturnType tail(Index n) const
    841 {
    842   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    843   return ConstSegmentReturnType(derived(), this->size() - n, n);
    844 }
    845 
    846 /** \returns a fixed-size expression of a segment (i.e. a vector block) in \c *this
    847   *
    848   * \only_for_vectors
    849   *
    850   * \tparam N the number of coefficients in the segment as specified at compile-time
    851   * \param start the index of the first element in the segment
    852   * \param n the number of coefficients in the segment as specified at compile-time
    853   *
    854   * The compile-time and run-time information should not contradict. In other words,
    855   * \a n should equal \a N unless \a N is \a Dynamic.
    856   *
    857   * Example: \include MatrixBase_template_int_segment.cpp
    858   * Output: \verbinclude MatrixBase_template_int_segment.out
    859   *
    860   * \sa class Block
    861   */
    862 template<int N>
    863 inline typename FixedSegmentReturnType<N>::Type segment(Index start, Index n = N)
    864 {
    865   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    866   return typename FixedSegmentReturnType<N>::Type(derived(), start, n);
    867 }
    868 
    869 /** This is the const version of segment<int>(Index).*/
    870 template<int N>
    871 inline typename ConstFixedSegmentReturnType<N>::Type segment(Index start, Index n = N) const
    872 {
    873   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    874   return typename ConstFixedSegmentReturnType<N>::Type(derived(), start, n);
    875 }
    876 
    877 /** \returns a fixed-size expression of the first coefficients of *this.
    878   *
    879   * \only_for_vectors
    880   *
    881   * \tparam N the number of coefficients in the segment as specified at compile-time
    882   * \param  n the number of coefficients in the segment as specified at run-time
    883   *
    884   * The compile-time and run-time information should not contradict. In other words,
    885   * \a n should equal \a N unless \a N is \a Dynamic.
    886   *
    887   * Example: \include MatrixBase_template_int_start.cpp
    888   * Output: \verbinclude MatrixBase_template_int_start.out
    889   *
    890   * \sa class Block
    891   */
    892 template<int N>
    893 inline typename FixedSegmentReturnType<N>::Type head(Index n = N)
    894 {
    895   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    896   return typename FixedSegmentReturnType<N>::Type(derived(), 0, n);
    897 }
    898 
    899 /** This is the const version of head<int>().*/
    900 template<int N>
    901 inline typename ConstFixedSegmentReturnType<N>::Type head(Index n = N) const
    902 {
    903   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    904   return typename ConstFixedSegmentReturnType<N>::Type(derived(), 0, n);
    905 }
    906 
    907 /** \returns a fixed-size expression of the last coefficients of *this.
    908   *
    909   * \only_for_vectors
    910   *
    911   * \tparam N the number of coefficients in the segment as specified at compile-time
    912   * \param  n the number of coefficients in the segment as specified at run-time
    913   *
    914   * The compile-time and run-time information should not contradict. In other words,
    915   * \a n should equal \a N unless \a N is \a Dynamic.
    916   *
    917   * Example: \include MatrixBase_template_int_end.cpp
    918   * Output: \verbinclude MatrixBase_template_int_end.out
    919   *
    920   * \sa class Block
    921   */
    922 template<int N>
    923 inline typename FixedSegmentReturnType<N>::Type tail(Index n = N)
    924 {
    925   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    926   return typename FixedSegmentReturnType<N>::Type(derived(), size() - n);
    927 }
    928 
    929 /** This is the const version of tail<int>.*/
    930 template<int N>
    931 inline typename ConstFixedSegmentReturnType<N>::Type tail(Index n = N) const
    932 {
    933   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    934   return typename ConstFixedSegmentReturnType<N>::Type(derived(), size() - n);
    935 }
    936