LCOV - code coverage report
Current view: top level - plugins - BlockMethods.h (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 14 14 100.0 %
Date: 1980-01-01 00:00:00 Functions: 18 18 100.0 %
Branches: 0 0 -

           Branch data     Line data    Source code
       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@inria.fr>
       5                 :            : // Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@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                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
      12                 :            : 
      13                 :            : /// \internal expression type of a column */
      14                 :            : typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, 1, !IsRowMajor> ColXpr;
      15                 :            : typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, 1, !IsRowMajor> ConstColXpr;
      16                 :            : /// \internal expression type of a row */
      17                 :            : typedef Block<Derived, 1, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> RowXpr;
      18                 :            : typedef const Block<const Derived, 1, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> ConstRowXpr;
      19                 :            : /// \internal expression type of a block of whole columns */
      20                 :            : typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, Dynamic, !IsRowMajor> ColsBlockXpr;
      21                 :            : typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, Dynamic, !IsRowMajor> ConstColsBlockXpr;
      22                 :            : /// \internal expression type of a block of whole rows */
      23                 :            : typedef Block<Derived, Dynamic, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> RowsBlockXpr;
      24                 :            : typedef const Block<const Derived, Dynamic, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> ConstRowsBlockXpr;
      25                 :            : /// \internal expression type of a block of whole columns */
      26                 :            : template<int N> struct NColsBlockXpr { typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type; };
      27                 :            : template<int N> struct ConstNColsBlockXpr { typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type; };
      28                 :            : /// \internal expression type of a block of whole rows */
      29                 :            : template<int N> struct NRowsBlockXpr { typedef Block<Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type; };
      30                 :            : template<int N> struct ConstNRowsBlockXpr { typedef const Block<const Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type; };
      31                 :            : /// \internal expression of a block */
      32                 :            : typedef Block<Derived> BlockXpr;
      33                 :            : typedef const Block<const Derived> ConstBlockXpr;
      34                 :            : /// \internal expression of a block of fixed sizes */
      35                 :            : template<int Rows, int Cols> struct FixedBlockXpr { typedef Block<Derived,Rows,Cols> Type; };
      36                 :            : template<int Rows, int Cols> struct ConstFixedBlockXpr { typedef Block<const Derived,Rows,Cols> Type; };
      37                 :            : 
      38                 :            : typedef VectorBlock<Derived> SegmentReturnType;
      39                 :            : typedef const VectorBlock<const Derived> ConstSegmentReturnType;
      40                 :            : template<int Size> struct FixedSegmentReturnType { typedef VectorBlock<Derived, Size> Type; };
      41                 :            : template<int Size> struct ConstFixedSegmentReturnType { typedef const VectorBlock<const Derived, Size> Type; };
      42                 :            : 
      43                 :            : /// \internal inner-vector
      44                 :            : typedef Block<Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true>       InnerVectorReturnType;
      45                 :            : typedef Block<const Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true> ConstInnerVectorReturnType;
      46                 :            : 
      47                 :            : /// \internal set of inner-vectors
      48                 :            : typedef Block<Derived,Dynamic,Dynamic,true> InnerVectorsReturnType;
      49                 :            : typedef Block<const Derived,Dynamic,Dynamic,true> ConstInnerVectorsReturnType;
      50                 :            : 
      51                 :            : #endif // not EIGEN_PARSED_BY_DOXYGEN
      52                 :            : 
      53                 :            : /// \returns an expression of a block in \c *this with either dynamic or fixed sizes.
      54                 :            : ///
      55                 :            : /// \param  startRow  the first row in the block
      56                 :            : /// \param  startCol  the first column in the block
      57                 :            : /// \param  blockRows number of rows in the block, specified at either run-time or compile-time
      58                 :            : /// \param  blockCols number of columns in the block, specified at either run-time or compile-time
      59                 :            : /// \tparam NRowsType the type of the value handling the number of rows in the block, typically Index.
      60                 :            : /// \tparam NColsType the type of the value handling the number of columns in the block, typically Index.
      61                 :            : ///
      62                 :            : /// Example using runtime (aka dynamic) sizes: \include MatrixBase_block_int_int_int_int.cpp
      63                 :            : /// Output: \verbinclude MatrixBase_block_int_int_int_int.out
      64                 :            : ///
      65                 :            : /// \newin{3.4}:
      66                 :            : ///
      67                 :            : /// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing Eigen::fix<N>,
      68                 :            : /// or Eigen::fix<N>(n) as arguments. In the later case, \c n plays the role of a runtime fallback value in case \c N equals Eigen::Dynamic.
      69                 :            : /// Here is an example with a fixed number of rows \c NRows and dynamic number of columns \c cols:
      70                 :            : /// \code
      71                 :            : /// mat.block(i,j,fix<NRows>,cols)
      72                 :            : /// \endcode
      73                 :            : ///
      74                 :            : /// This function thus fully covers the features offered by the following overloads block<NRows,NCols>(Index, Index),
      75                 :            : /// and block<NRows,NCols>(Index, Index, Index, Index) that are thus obsolete. Indeed, this generic version avoids
      76                 :            : /// redundancy, it preserves the argument order, and prevents the need to rely on the template keyword in templated code.
      77                 :            : ///
      78                 :            : /// but with less redundancy and more consistency as it does not modify the argument order
      79                 :            : /// and seamlessly enable hybrid fixed/dynamic sizes.
      80                 :            : ///
      81                 :            : /// \note Even in the case that the returned expression has dynamic size, in the case
      82                 :            : /// when it is applied to a fixed-size matrix, it inherits a fixed maximal size,
      83                 :            : /// which means that evaluating it does not cause a dynamic memory allocation.
      84                 :            : ///
      85                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
      86                 :            : ///
      87                 :            : /// \sa class Block, fix, fix<N>(int)
      88                 :            : ///
      89                 :            : template<typename NRowsType, typename NColsType>
      90                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
      91                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
      92                 :            : typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
      93                 :            : #else
      94                 :            : typename FixedBlockXpr<...,...>::Type
      95                 :            : #endif
      96                 :        306 : block(Index startRow, Index startCol, NRowsType blockRows, NColsType blockCols)
      97                 :            : {
      98                 :            :   return typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type(
      99                 :        306 :             derived(), startRow, startCol, internal::get_runtime_value(blockRows), internal::get_runtime_value(blockCols));
     100                 :            : }
     101                 :            : 
     102                 :            : /// This is the const version of block(Index,Index,NRowsType,NColsType)
     103                 :            : template<typename NRowsType, typename NColsType>
     104                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     105                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     106                 :            : const typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     107                 :            : #else
     108                 :            : const typename ConstFixedBlockXpr<...,...>::Type
     109                 :            : #endif
     110                 :            : block(Index startRow, Index startCol, NRowsType blockRows, NColsType blockCols) const
     111                 :            : {
     112                 :            :   return typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type(
     113                 :            :             derived(), startRow, startCol, internal::get_runtime_value(blockRows), internal::get_runtime_value(blockCols));
     114                 :            : }
     115                 :            : 
     116                 :            : 
     117                 :            : 
     118                 :            : /// \returns a expression of a top-right corner of \c *this with either dynamic or fixed sizes.
     119                 :            : ///
     120                 :            : /// \param cRows the number of rows in the corner
     121                 :            : /// \param cCols the number of columns in the corner
     122                 :            : /// \tparam NRowsType the type of the value handling the number of rows in the block, typically Index.
     123                 :            : /// \tparam NColsType the type of the value handling the number of columns in the block, typically Index.
     124                 :            : ///
     125                 :            : /// Example with dynamic sizes: \include MatrixBase_topRightCorner_int_int.cpp
     126                 :            : /// Output: \verbinclude MatrixBase_topRightCorner_int_int.out
     127                 :            : ///
     128                 :            : /// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing Eigen::fix<N>,
     129                 :            : /// or Eigen::fix<N>(n) as arguments. See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
     130                 :            : ///
     131                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     132                 :            : ///
     133                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     134                 :            : ///
     135                 :            : template<typename NRowsType, typename NColsType>
     136                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     137                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     138                 :            : typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     139                 :            : #else
     140                 :            : typename FixedBlockXpr<...,...>::Type
     141                 :            : #endif
     142                 :            : topRightCorner(NRowsType cRows, NColsType cCols)
     143                 :            : {
     144                 :            :   return typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     145                 :            :             (derived(), 0, cols() - internal::get_runtime_value(cCols), internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
     146                 :            : }
     147                 :            : 
     148                 :            : /// This is the const version of topRightCorner(NRowsType, NColsType).
     149                 :            : template<typename NRowsType, typename NColsType>
     150                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     151                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     152                 :            : const typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     153                 :            : #else
     154                 :            : const typename ConstFixedBlockXpr<...,...>::Type
     155                 :            : #endif
     156                 :            : topRightCorner(NRowsType cRows, NColsType cCols) const
     157                 :            : {
     158                 :            :   return typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     159                 :            :             (derived(), 0, cols() - internal::get_runtime_value(cCols), internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
     160                 :            : }
     161                 :            : 
     162                 :            : /// \returns an expression of a fixed-size top-right corner of \c *this.
     163                 :            : ///
     164                 :            : /// \tparam CRows the number of rows in the corner
     165                 :            : /// \tparam CCols the number of columns in the corner
     166                 :            : ///
     167                 :            : /// Example: \include MatrixBase_template_int_int_topRightCorner.cpp
     168                 :            : /// Output: \verbinclude MatrixBase_template_int_int_topRightCorner.out
     169                 :            : ///
     170                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     171                 :            : ///
     172                 :            : /// \sa class Block, block<int,int>(Index,Index)
     173                 :            : ///
     174                 :            : template<int CRows, int CCols>
     175                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     176                 :            : typename FixedBlockXpr<CRows,CCols>::Type topRightCorner()
     177                 :            : {
     178                 :            :   return typename FixedBlockXpr<CRows,CCols>::Type(derived(), 0, cols() - CCols);
     179                 :            : }
     180                 :            : 
     181                 :            : /// This is the const version of topRightCorner<int, int>().
     182                 :            : template<int CRows, int CCols>
     183                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     184                 :            : const typename ConstFixedBlockXpr<CRows,CCols>::Type topRightCorner() const
     185                 :            : {
     186                 :            :   return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), 0, cols() - CCols);
     187                 :            : }
     188                 :            : 
     189                 :            : /// \returns an expression of a top-right corner of \c *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_topRightCorner_int_int.cpp
     202                 :            : /// Output: \verbinclude MatrixBase_template_int_int_topRightCorner_int_int.out
     203                 :            : ///
     204                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     205                 :            : ///
     206                 :            : /// \sa class Block
     207                 :            : ///
     208                 :            : template<int CRows, int CCols>
     209                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     210                 :            : typename FixedBlockXpr<CRows,CCols>::Type topRightCorner(Index cRows, Index cCols)
     211                 :            : {
     212                 :            :   return typename FixedBlockXpr<CRows,CCols>::Type(derived(), 0, cols() - cCols, cRows, cCols);
     213                 :            : }
     214                 :            : 
     215                 :            : /// This is the const version of topRightCorner<int, int>(Index, Index).
     216                 :            : template<int CRows, int CCols>
     217                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     218                 :            : const typename ConstFixedBlockXpr<CRows,CCols>::Type topRightCorner(Index cRows, Index cCols) const
     219                 :            : {
     220                 :            :   return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), 0, cols() - cCols, cRows, cCols);
     221                 :            : }
     222                 :            : 
     223                 :            : 
     224                 :            : 
     225                 :            : /// \returns an expression of a top-left corner of \c *this  with either dynamic or fixed sizes.
     226                 :            : ///
     227                 :            : /// \param cRows the number of rows in the corner
     228                 :            : /// \param cCols the number of columns in the corner
     229                 :            : /// \tparam NRowsType the type of the value handling the number of rows in the block, typically Index.
     230                 :            : /// \tparam NColsType the type of the value handling the number of columns in the block, typically Index.
     231                 :            : ///
     232                 :            : /// Example: \include MatrixBase_topLeftCorner_int_int.cpp
     233                 :            : /// Output: \verbinclude MatrixBase_topLeftCorner_int_int.out
     234                 :            : ///
     235                 :            : /// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing Eigen::fix<N>,
     236                 :            : /// or Eigen::fix<N>(n) as arguments. See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
     237                 :            : ///
     238                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     239                 :            : ///
     240                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     241                 :            : ///
     242                 :            : template<typename NRowsType, typename NColsType>
     243                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     244                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     245                 :            : typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     246                 :            : #else
     247                 :            : typename FixedBlockXpr<...,...>::Type
     248                 :            : #endif
     249                 :            : topLeftCorner(NRowsType cRows, NColsType cCols)
     250                 :            : {
     251                 :            :   return typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     252                 :            :             (derived(), 0, 0, internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
     253                 :            : }
     254                 :            : 
     255                 :            : /// This is the const version of topLeftCorner(Index, Index).
     256                 :            : template<typename NRowsType, typename NColsType>
     257                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     258                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     259                 :            : const typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     260                 :            : #else
     261                 :            : const typename ConstFixedBlockXpr<...,...>::Type
     262                 :            : #endif
     263                 :            : topLeftCorner(NRowsType cRows, NColsType cCols) const
     264                 :            : {
     265                 :            :   return typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     266                 :            :             (derived(), 0, 0, internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
     267                 :            : }
     268                 :            : 
     269                 :            : /// \returns an expression of a fixed-size top-left corner of \c *this.
     270                 :            : ///
     271                 :            : /// The template parameters CRows and CCols are the number of rows and columns in the corner.
     272                 :            : ///
     273                 :            : /// Example: \include MatrixBase_template_int_int_topLeftCorner.cpp
     274                 :            : /// Output: \verbinclude MatrixBase_template_int_int_topLeftCorner.out
     275                 :            : ///
     276                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     277                 :            : ///
     278                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     279                 :            : ///
     280                 :            : template<int CRows, int CCols>
     281                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     282                 :            : typename FixedBlockXpr<CRows,CCols>::Type topLeftCorner()
     283                 :            : {
     284                 :            :   return typename FixedBlockXpr<CRows,CCols>::Type(derived(), 0, 0);
     285                 :            : }
     286                 :            : 
     287                 :            : /// This is the const version of topLeftCorner<int, int>().
     288                 :            : template<int CRows, int CCols>
     289                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     290                 :            : const typename ConstFixedBlockXpr<CRows,CCols>::Type topLeftCorner() const
     291                 :            : {
     292                 :            :   return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), 0, 0);
     293                 :            : }
     294                 :            : 
     295                 :            : /// \returns an expression of a top-left corner of \c *this.
     296                 :            : ///
     297                 :            : /// \tparam CRows number of rows in corner as specified at compile-time
     298                 :            : /// \tparam CCols number of columns in corner as specified at compile-time
     299                 :            : /// \param  cRows number of rows in corner as specified at run-time
     300                 :            : /// \param  cCols number of columns in corner as specified at run-time
     301                 :            : ///
     302                 :            : /// This function is mainly useful for corners where the number of rows is specified at compile-time
     303                 :            : /// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
     304                 :            : /// information should not contradict. In other words, \a cRows should equal \a CRows unless
     305                 :            : /// \a CRows is \a Dynamic, and the same for the number of columns.
     306                 :            : ///
     307                 :            : /// Example: \include MatrixBase_template_int_int_topLeftCorner_int_int.cpp
     308                 :            : /// Output: \verbinclude MatrixBase_template_int_int_topLeftCorner_int_int.out
     309                 :            : ///
     310                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     311                 :            : ///
     312                 :            : /// \sa class Block
     313                 :            : ///
     314                 :            : template<int CRows, int CCols>
     315                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     316                 :            : typename FixedBlockXpr<CRows,CCols>::Type topLeftCorner(Index cRows, Index cCols)
     317                 :            : {
     318                 :            :   return typename FixedBlockXpr<CRows,CCols>::Type(derived(), 0, 0, cRows, cCols);
     319                 :            : }
     320                 :            : 
     321                 :            : /// This is the const version of topLeftCorner<int, int>(Index, Index).
     322                 :            : template<int CRows, int CCols>
     323                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     324                 :            : const typename ConstFixedBlockXpr<CRows,CCols>::Type topLeftCorner(Index cRows, Index cCols) const
     325                 :            : {
     326                 :            :   return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), 0, 0, cRows, cCols);
     327                 :            : }
     328                 :            : 
     329                 :            : 
     330                 :            : 
     331                 :            : /// \returns an expression of a bottom-right corner of \c *this  with either dynamic or fixed sizes.
     332                 :            : ///
     333                 :            : /// \param cRows the number of rows in the corner
     334                 :            : /// \param cCols the number of columns in the corner
     335                 :            : /// \tparam NRowsType the type of the value handling the number of rows in the block, typically Index.
     336                 :            : /// \tparam NColsType the type of the value handling the number of columns in the block, typically Index.
     337                 :            : ///
     338                 :            : /// Example: \include MatrixBase_bottomRightCorner_int_int.cpp
     339                 :            : /// Output: \verbinclude MatrixBase_bottomRightCorner_int_int.out
     340                 :            : ///
     341                 :            : /// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing Eigen::fix<N>,
     342                 :            : /// or Eigen::fix<N>(n) as arguments. See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
     343                 :            : ///
     344                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     345                 :            : ///
     346                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     347                 :            : ///
     348                 :            : template<typename NRowsType, typename NColsType>
     349                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     350                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     351                 :            : typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     352                 :            : #else
     353                 :            : typename FixedBlockXpr<...,...>::Type
     354                 :            : #endif
     355                 :            : bottomRightCorner(NRowsType cRows, NColsType cCols)
     356                 :            : {
     357                 :            :   return typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     358                 :            :             (derived(), rows() - internal::get_runtime_value(cRows), cols() - internal::get_runtime_value(cCols),
     359                 :            :                         internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
     360                 :            : }
     361                 :            : 
     362                 :            : /// This is the const version of bottomRightCorner(NRowsType, NColsType).
     363                 :            : template<typename NRowsType, typename NColsType>
     364                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     365                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     366                 :            : const typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     367                 :            : #else
     368                 :            : const typename ConstFixedBlockXpr<...,...>::Type
     369                 :            : #endif
     370                 :            : bottomRightCorner(NRowsType cRows, NColsType cCols) const
     371                 :            : {
     372                 :            :   return typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     373                 :            :             (derived(), rows() - internal::get_runtime_value(cRows), cols() - internal::get_runtime_value(cCols),
     374                 :            :                         internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
     375                 :            : }
     376                 :            : 
     377                 :            : /// \returns an expression of a fixed-size bottom-right corner of \c *this.
     378                 :            : ///
     379                 :            : /// The template parameters CRows and CCols are the number of rows and columns in the corner.
     380                 :            : ///
     381                 :            : /// Example: \include MatrixBase_template_int_int_bottomRightCorner.cpp
     382                 :            : /// Output: \verbinclude MatrixBase_template_int_int_bottomRightCorner.out
     383                 :            : ///
     384                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     385                 :            : ///
     386                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     387                 :            : ///
     388                 :            : template<int CRows, int CCols>
     389                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     390                 :            : typename FixedBlockXpr<CRows,CCols>::Type bottomRightCorner()
     391                 :            : {
     392                 :            :   return typename FixedBlockXpr<CRows,CCols>::Type(derived(), rows() - CRows, cols() - CCols);
     393                 :            : }
     394                 :            : 
     395                 :            : /// This is the const version of bottomRightCorner<int, int>().
     396                 :            : template<int CRows, int CCols>
     397                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     398                 :            : const typename ConstFixedBlockXpr<CRows,CCols>::Type bottomRightCorner() const
     399                 :            : {
     400                 :            :   return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), rows() - CRows, cols() - CCols);
     401                 :            : }
     402                 :            : 
     403                 :            : /// \returns an expression of a bottom-right corner of \c *this.
     404                 :            : ///
     405                 :            : /// \tparam CRows number of rows in corner as specified at compile-time
     406                 :            : /// \tparam CCols number of columns in corner as specified at compile-time
     407                 :            : /// \param  cRows number of rows in corner as specified at run-time
     408                 :            : /// \param  cCols number of columns in corner as specified at run-time
     409                 :            : ///
     410                 :            : /// This function is mainly useful for corners where the number of rows is specified at compile-time
     411                 :            : /// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
     412                 :            : /// information should not contradict. In other words, \a cRows should equal \a CRows unless
     413                 :            : /// \a CRows is \a Dynamic, and the same for the number of columns.
     414                 :            : ///
     415                 :            : /// Example: \include MatrixBase_template_int_int_bottomRightCorner_int_int.cpp
     416                 :            : /// Output: \verbinclude MatrixBase_template_int_int_bottomRightCorner_int_int.out
     417                 :            : ///
     418                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     419                 :            : ///
     420                 :            : /// \sa class Block
     421                 :            : ///
     422                 :            : template<int CRows, int CCols>
     423                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     424                 :            : typename FixedBlockXpr<CRows,CCols>::Type bottomRightCorner(Index cRows, Index cCols)
     425                 :            : {
     426                 :            :   return typename FixedBlockXpr<CRows,CCols>::Type(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
     427                 :            : }
     428                 :            : 
     429                 :            : /// This is the const version of bottomRightCorner<int, int>(Index, Index).
     430                 :            : template<int CRows, int CCols>
     431                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     432                 :            : const typename ConstFixedBlockXpr<CRows,CCols>::Type bottomRightCorner(Index cRows, Index cCols) const
     433                 :            : {
     434                 :            :   return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
     435                 :            : }
     436                 :            : 
     437                 :            : 
     438                 :            : 
     439                 :            : /// \returns an expression of a bottom-left corner of \c *this  with either dynamic or fixed sizes.
     440                 :            : ///
     441                 :            : /// \param cRows the number of rows in the corner
     442                 :            : /// \param cCols the number of columns in the corner
     443                 :            : /// \tparam NRowsType the type of the value handling the number of rows in the block, typically Index.
     444                 :            : /// \tparam NColsType the type of the value handling the number of columns in the block, typically Index.
     445                 :            : ///
     446                 :            : /// Example: \include MatrixBase_bottomLeftCorner_int_int.cpp
     447                 :            : /// Output: \verbinclude MatrixBase_bottomLeftCorner_int_int.out
     448                 :            : ///
     449                 :            : /// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing Eigen::fix<N>,
     450                 :            : /// or Eigen::fix<N>(n) as arguments. See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
     451                 :            : ///
     452                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     453                 :            : ///
     454                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     455                 :            : ///
     456                 :            : template<typename NRowsType, typename NColsType>
     457                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     458                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     459                 :            : typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     460                 :            : #else
     461                 :            : typename FixedBlockXpr<...,...>::Type
     462                 :            : #endif
     463                 :            : bottomLeftCorner(NRowsType cRows, NColsType cCols)
     464                 :            : {
     465                 :            :   return typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     466                 :            :             (derived(), rows() - internal::get_runtime_value(cRows), 0,
     467                 :            :                         internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
     468                 :            : }
     469                 :            : 
     470                 :            : /// This is the const version of bottomLeftCorner(NRowsType, NColsType).
     471                 :            : template<typename NRowsType, typename NColsType>
     472                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     473                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     474                 :            : typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     475                 :            : #else
     476                 :            : typename ConstFixedBlockXpr<...,...>::Type
     477                 :            : #endif
     478                 :            : bottomLeftCorner(NRowsType cRows, NColsType cCols) const
     479                 :            : {
     480                 :            :   return typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
     481                 :            :             (derived(), rows() - internal::get_runtime_value(cRows), 0,
     482                 :            :                         internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
     483                 :            : }
     484                 :            : 
     485                 :            : /// \returns an expression of a fixed-size bottom-left corner of \c *this.
     486                 :            : ///
     487                 :            : /// The template parameters CRows and CCols are the number of rows and columns in the corner.
     488                 :            : ///
     489                 :            : /// Example: \include MatrixBase_template_int_int_bottomLeftCorner.cpp
     490                 :            : /// Output: \verbinclude MatrixBase_template_int_int_bottomLeftCorner.out
     491                 :            : ///
     492                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     493                 :            : ///
     494                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     495                 :            : ///
     496                 :            : template<int CRows, int CCols>
     497                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     498                 :            : typename FixedBlockXpr<CRows,CCols>::Type bottomLeftCorner()
     499                 :            : {
     500                 :            :   return typename FixedBlockXpr<CRows,CCols>::Type(derived(), rows() - CRows, 0);
     501                 :            : }
     502                 :            : 
     503                 :            : /// This is the const version of bottomLeftCorner<int, int>().
     504                 :            : template<int CRows, int CCols>
     505                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     506                 :            : const typename ConstFixedBlockXpr<CRows,CCols>::Type bottomLeftCorner() const
     507                 :            : {
     508                 :            :   return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), rows() - CRows, 0);
     509                 :            : }
     510                 :            : 
     511                 :            : /// \returns an expression of a bottom-left corner of \c *this.
     512                 :            : ///
     513                 :            : /// \tparam CRows number of rows in corner as specified at compile-time
     514                 :            : /// \tparam CCols number of columns in corner as specified at compile-time
     515                 :            : /// \param  cRows number of rows in corner as specified at run-time
     516                 :            : /// \param  cCols number of columns in corner as specified at run-time
     517                 :            : ///
     518                 :            : /// This function is mainly useful for corners where the number of rows is specified at compile-time
     519                 :            : /// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
     520                 :            : /// information should not contradict. In other words, \a cRows should equal \a CRows unless
     521                 :            : /// \a CRows is \a Dynamic, and the same for the number of columns.
     522                 :            : ///
     523                 :            : /// Example: \include MatrixBase_template_int_int_bottomLeftCorner_int_int.cpp
     524                 :            : /// Output: \verbinclude MatrixBase_template_int_int_bottomLeftCorner_int_int.out
     525                 :            : ///
     526                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     527                 :            : ///
     528                 :            : /// \sa class Block
     529                 :            : ///
     530                 :            : template<int CRows, int CCols>
     531                 :            : EIGEN_STRONG_INLINE
     532                 :            : typename FixedBlockXpr<CRows,CCols>::Type bottomLeftCorner(Index cRows, Index cCols)
     533                 :            : {
     534                 :            :   return typename FixedBlockXpr<CRows,CCols>::Type(derived(), rows() - cRows, 0, cRows, cCols);
     535                 :            : }
     536                 :            : 
     537                 :            : /// This is the const version of bottomLeftCorner<int, int>(Index, Index).
     538                 :            : template<int CRows, int CCols>
     539                 :            : EIGEN_STRONG_INLINE
     540                 :            : const typename ConstFixedBlockXpr<CRows,CCols>::Type bottomLeftCorner(Index cRows, Index cCols) const
     541                 :            : {
     542                 :            :   return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), rows() - cRows, 0, cRows, cCols);
     543                 :            : }
     544                 :            : 
     545                 :            : 
     546                 :            : 
     547                 :            : /// \returns a block consisting of the top rows of \c *this.
     548                 :            : ///
     549                 :            : /// \param n the number of rows in the block
     550                 :            : /// \tparam NRowsType the type of the value handling the number of rows in the block, typically Index.
     551                 :            : ///
     552                 :            : /// Example: \include MatrixBase_topRows_int.cpp
     553                 :            : /// Output: \verbinclude MatrixBase_topRows_int.out
     554                 :            : ///
     555                 :            : /// The number of rows \a n can also be specified at compile-time by passing Eigen::fix<N>,
     556                 :            : /// or Eigen::fix<N>(n) as arguments.
     557                 :            : /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
     558                 :            : ///
     559                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
     560                 :            : ///
     561                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     562                 :            : ///
     563                 :            : template<typename NRowsType>
     564                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     565                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     566                 :            : typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
     567                 :            : #else
     568                 :            : typename NRowsBlockXpr<...>::Type
     569                 :            : #endif
     570                 :            : topRows(NRowsType n)
     571                 :            : {
     572                 :            :   return typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
     573                 :            :             (derived(), 0, 0, internal::get_runtime_value(n), cols());
     574                 :            : }
     575                 :            : 
     576                 :            : /// This is the const version of topRows(NRowsType).
     577                 :            : template<typename NRowsType>
     578                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     579                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     580                 :            : const typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
     581                 :            : #else
     582                 :            : const typename ConstNRowsBlockXpr<...>::Type
     583                 :            : #endif
     584                 :            : topRows(NRowsType n) const
     585                 :            : {
     586                 :            :   return typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
     587                 :            :             (derived(), 0, 0, internal::get_runtime_value(n), cols());
     588                 :            : }
     589                 :            : 
     590                 :            : /// \returns a block consisting of the top rows of \c *this.
     591                 :            : ///
     592                 :            : /// \tparam N the number of rows in the block as specified at compile-time
     593                 :            : /// \param n the number of rows in the block as specified at run-time
     594                 :            : ///
     595                 :            : /// The compile-time and run-time information should not contradict. In other words,
     596                 :            : /// \a n should equal \a N unless \a N is \a Dynamic.
     597                 :            : ///
     598                 :            : /// Example: \include MatrixBase_template_int_topRows.cpp
     599                 :            : /// Output: \verbinclude MatrixBase_template_int_topRows.out
     600                 :            : ///
     601                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
     602                 :            : ///
     603                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     604                 :            : ///
     605                 :            : template<int N>
     606                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     607                 :            : typename NRowsBlockXpr<N>::Type topRows(Index n = N)
     608                 :            : {
     609                 :            :   return typename NRowsBlockXpr<N>::Type(derived(), 0, 0, n, cols());
     610                 :            : }
     611                 :            : 
     612                 :            : /// This is the const version of topRows<int>().
     613                 :            : template<int N>
     614                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     615                 :            : typename ConstNRowsBlockXpr<N>::Type topRows(Index n = N) const
     616                 :            : {
     617                 :            :   return typename ConstNRowsBlockXpr<N>::Type(derived(), 0, 0, n, cols());
     618                 :            : }
     619                 :            : 
     620                 :            : 
     621                 :            : 
     622                 :            : /// \returns a block consisting of the bottom rows of \c *this.
     623                 :            : ///
     624                 :            : /// \param n the number of rows in the block
     625                 :            : /// \tparam NRowsType the type of the value handling the number of rows in the block, typically Index.
     626                 :            : ///
     627                 :            : /// Example: \include MatrixBase_bottomRows_int.cpp
     628                 :            : /// Output: \verbinclude MatrixBase_bottomRows_int.out
     629                 :            : ///
     630                 :            : /// The number of rows \a n can also be specified at compile-time by passing Eigen::fix<N>,
     631                 :            : /// or Eigen::fix<N>(n) as arguments.
     632                 :            : /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
     633                 :            : ///
     634                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
     635                 :            : ///
     636                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     637                 :            : ///
     638                 :            : template<typename NRowsType>
     639                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     640                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     641                 :            : typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
     642                 :            : #else
     643                 :            : typename NRowsBlockXpr<...>::Type
     644                 :            : #endif
     645                 :            : bottomRows(NRowsType n)
     646                 :            : {
     647                 :            :   return typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
     648                 :            :             (derived(), rows() - internal::get_runtime_value(n), 0, internal::get_runtime_value(n), cols());
     649                 :            : }
     650                 :            : 
     651                 :            : /// This is the const version of bottomRows(NRowsType).
     652                 :            : template<typename NRowsType>
     653                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     654                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     655                 :            : const typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
     656                 :            : #else
     657                 :            : const typename ConstNRowsBlockXpr<...>::Type
     658                 :            : #endif
     659                 :            : bottomRows(NRowsType n) const
     660                 :            : {
     661                 :            :   return typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
     662                 :            :             (derived(), rows() - internal::get_runtime_value(n), 0, internal::get_runtime_value(n), cols());
     663                 :            : }
     664                 :            : 
     665                 :            : /// \returns a block consisting of the bottom rows of \c *this.
     666                 :            : ///
     667                 :            : /// \tparam N the number of rows in the block as specified at compile-time
     668                 :            : /// \param n the number of rows in the block as specified at run-time
     669                 :            : ///
     670                 :            : /// The compile-time and run-time information should not contradict. In other words,
     671                 :            : /// \a n should equal \a N unless \a N is \a Dynamic.
     672                 :            : ///
     673                 :            : /// Example: \include MatrixBase_template_int_bottomRows.cpp
     674                 :            : /// Output: \verbinclude MatrixBase_template_int_bottomRows.out
     675                 :            : ///
     676                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
     677                 :            : ///
     678                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     679                 :            : ///
     680                 :            : template<int N>
     681                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     682                 :            : typename NRowsBlockXpr<N>::Type bottomRows(Index n = N)
     683                 :            : {
     684                 :            :   return typename NRowsBlockXpr<N>::Type(derived(), rows() - n, 0, n, cols());
     685                 :            : }
     686                 :            : 
     687                 :            : /// This is the const version of bottomRows<int>().
     688                 :            : template<int N>
     689                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     690                 :            : typename ConstNRowsBlockXpr<N>::Type bottomRows(Index n = N) const
     691                 :            : {
     692                 :            :   return typename ConstNRowsBlockXpr<N>::Type(derived(), rows() - n, 0, n, cols());
     693                 :            : }
     694                 :            : 
     695                 :            : 
     696                 :            : 
     697                 :            : /// \returns a block consisting of a range of rows of \c *this.
     698                 :            : ///
     699                 :            : /// \param startRow the index of the first row in the block
     700                 :            : /// \param n the number of rows in the block
     701                 :            : /// \tparam NRowsType the type of the value handling the number of rows in the block, typically Index.
     702                 :            : ///
     703                 :            : /// Example: \include DenseBase_middleRows_int.cpp
     704                 :            : /// Output: \verbinclude DenseBase_middleRows_int.out
     705                 :            : ///
     706                 :            : /// The number of rows \a n can also be specified at compile-time by passing Eigen::fix<N>,
     707                 :            : /// or Eigen::fix<N>(n) as arguments.
     708                 :            : /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
     709                 :            : ///
     710                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
     711                 :            : ///
     712                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     713                 :            : ///
     714                 :            : template<typename NRowsType>
     715                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     716                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     717                 :            : typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
     718                 :            : #else
     719                 :            : typename NRowsBlockXpr<...>::Type
     720                 :            : #endif
     721                 :            : middleRows(Index startRow, NRowsType n)
     722                 :            : {
     723                 :            :   return typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
     724                 :            :             (derived(), startRow, 0, internal::get_runtime_value(n), cols());
     725                 :            : }
     726                 :            : 
     727                 :            : /// This is the const version of middleRows(Index,NRowsType).
     728                 :            : template<typename NRowsType>
     729                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     730                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     731                 :            : const typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
     732                 :            : #else
     733                 :            : const typename ConstNRowsBlockXpr<...>::Type
     734                 :            : #endif
     735                 :            : middleRows(Index startRow, NRowsType n) const
     736                 :            : {
     737                 :            :   return typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
     738                 :            :             (derived(), startRow, 0, internal::get_runtime_value(n), cols());
     739                 :            : }
     740                 :            : 
     741                 :            : /// \returns a block consisting of a range of rows of \c *this.
     742                 :            : ///
     743                 :            : /// \tparam N the number of rows in the block as specified at compile-time
     744                 :            : /// \param startRow the index of the first row in the block
     745                 :            : /// \param n the number of rows in the block as specified at run-time
     746                 :            : ///
     747                 :            : /// The compile-time and run-time information should not contradict. In other words,
     748                 :            : /// \a n should equal \a N unless \a N is \a Dynamic.
     749                 :            : ///
     750                 :            : /// Example: \include DenseBase_template_int_middleRows.cpp
     751                 :            : /// Output: \verbinclude DenseBase_template_int_middleRows.out
     752                 :            : ///
     753                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
     754                 :            : ///
     755                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     756                 :            : ///
     757                 :            : template<int N>
     758                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     759                 :            : typename NRowsBlockXpr<N>::Type middleRows(Index startRow, Index n = N)
     760                 :            : {
     761                 :            :   return typename NRowsBlockXpr<N>::Type(derived(), startRow, 0, n, cols());
     762                 :            : }
     763                 :            : 
     764                 :            : /// This is the const version of middleRows<int>().
     765                 :            : template<int N>
     766                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     767                 :            : typename ConstNRowsBlockXpr<N>::Type middleRows(Index startRow, Index n = N) const
     768                 :            : {
     769                 :            :   return typename ConstNRowsBlockXpr<N>::Type(derived(), startRow, 0, n, cols());
     770                 :            : }
     771                 :            : 
     772                 :            : 
     773                 :            : 
     774                 :            : /// \returns a block consisting of the left columns of \c *this.
     775                 :            : ///
     776                 :            : /// \param n the number of columns in the block
     777                 :            : /// \tparam NColsType the type of the value handling the number of columns in the block, typically Index.
     778                 :            : ///
     779                 :            : /// Example: \include MatrixBase_leftCols_int.cpp
     780                 :            : /// Output: \verbinclude MatrixBase_leftCols_int.out
     781                 :            : ///
     782                 :            : /// The number of columns \a n can also be specified at compile-time by passing Eigen::fix<N>,
     783                 :            : /// or Eigen::fix<N>(n) as arguments.
     784                 :            : /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
     785                 :            : ///
     786                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
     787                 :            : ///
     788                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     789                 :            : ///
     790                 :            : template<typename NColsType>
     791                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     792                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     793                 :            : typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
     794                 :            : #else
     795                 :            : typename NColsBlockXpr<...>::Type
     796                 :            : #endif
     797                 :            : leftCols(NColsType n)
     798                 :            : {
     799                 :            :   return typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
     800                 :            :             (derived(), 0, 0, rows(), internal::get_runtime_value(n));
     801                 :            : }
     802                 :            : 
     803                 :            : /// This is the const version of leftCols(NColsType).
     804                 :            : template<typename NColsType>
     805                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     806                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     807                 :            : const typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
     808                 :            : #else
     809                 :            : const typename ConstNColsBlockXpr<...>::Type
     810                 :            : #endif
     811                 :            : leftCols(NColsType n) const
     812                 :            : {
     813                 :            :   return typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
     814                 :            :             (derived(), 0, 0, rows(), internal::get_runtime_value(n));
     815                 :            : }
     816                 :            : 
     817                 :            : /// \returns a block consisting of the left columns of \c *this.
     818                 :            : ///
     819                 :            : /// \tparam N the number of columns in the block as specified at compile-time
     820                 :            : /// \param n the number of columns in the block as specified at run-time
     821                 :            : ///
     822                 :            : /// The compile-time and run-time information should not contradict. In other words,
     823                 :            : /// \a n should equal \a N unless \a N is \a Dynamic.
     824                 :            : ///
     825                 :            : /// Example: \include MatrixBase_template_int_leftCols.cpp
     826                 :            : /// Output: \verbinclude MatrixBase_template_int_leftCols.out
     827                 :            : ///
     828                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
     829                 :            : ///
     830                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     831                 :            : ///
     832                 :            : template<int N>
     833                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     834                 :            : typename NColsBlockXpr<N>::Type leftCols(Index n = N)
     835                 :            : {
     836                 :            :   return typename NColsBlockXpr<N>::Type(derived(), 0, 0, rows(), n);
     837                 :            : }
     838                 :            : 
     839                 :            : /// This is the const version of leftCols<int>().
     840                 :            : template<int N>
     841                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     842                 :            : typename ConstNColsBlockXpr<N>::Type leftCols(Index n = N) const
     843                 :            : {
     844                 :            :   return typename ConstNColsBlockXpr<N>::Type(derived(), 0, 0, rows(), n);
     845                 :            : }
     846                 :            : 
     847                 :            : 
     848                 :            : 
     849                 :            : /// \returns a block consisting of the right columns of \c *this.
     850                 :            : ///
     851                 :            : /// \param n the number of columns in the block
     852                 :            : /// \tparam NColsType the type of the value handling the number of columns in the block, typically Index.
     853                 :            : ///
     854                 :            : /// Example: \include MatrixBase_rightCols_int.cpp
     855                 :            : /// Output: \verbinclude MatrixBase_rightCols_int.out
     856                 :            : ///
     857                 :            : /// The number of columns \a n can also be specified at compile-time by passing Eigen::fix<N>,
     858                 :            : /// or Eigen::fix<N>(n) as arguments.
     859                 :            : /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
     860                 :            : ///
     861                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
     862                 :            : ///
     863                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     864                 :            : ///
     865                 :            : template<typename NColsType>
     866                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     867                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     868                 :            : typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
     869                 :            : #else
     870                 :            : typename NColsBlockXpr<...>::Type
     871                 :            : #endif
     872                 :            : rightCols(NColsType n)
     873                 :            : {
     874                 :            :   return typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
     875                 :            :             (derived(), 0, cols() - internal::get_runtime_value(n), rows(), internal::get_runtime_value(n));
     876                 :            : }
     877                 :            : 
     878                 :            : /// This is the const version of rightCols(NColsType).
     879                 :            : template<typename NColsType>
     880                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     881                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     882                 :            : const typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
     883                 :            : #else
     884                 :            : const typename ConstNColsBlockXpr<...>::Type
     885                 :            : #endif
     886                 :            : rightCols(NColsType n) const
     887                 :            : {
     888                 :            :   return typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
     889                 :            :             (derived(), 0, cols() - internal::get_runtime_value(n), rows(), internal::get_runtime_value(n));
     890                 :            : }
     891                 :            : 
     892                 :            : /// \returns a block consisting of the right columns of \c *this.
     893                 :            : ///
     894                 :            : /// \tparam N the number of columns in the block as specified at compile-time
     895                 :            : /// \param n the number of columns in the block as specified at run-time
     896                 :            : ///
     897                 :            : /// The compile-time and run-time information should not contradict. In other words,
     898                 :            : /// \a n should equal \a N unless \a N is \a Dynamic.
     899                 :            : ///
     900                 :            : /// Example: \include MatrixBase_template_int_rightCols.cpp
     901                 :            : /// Output: \verbinclude MatrixBase_template_int_rightCols.out
     902                 :            : ///
     903                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
     904                 :            : ///
     905                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     906                 :            : ///
     907                 :            : template<int N>
     908                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     909                 :            : typename NColsBlockXpr<N>::Type rightCols(Index n = N)
     910                 :            : {
     911                 :            :   return typename NColsBlockXpr<N>::Type(derived(), 0, cols() - n, rows(), n);
     912                 :            : }
     913                 :            : 
     914                 :            : /// This is the const version of rightCols<int>().
     915                 :            : template<int N>
     916                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     917                 :            : typename ConstNColsBlockXpr<N>::Type rightCols(Index n = N) const
     918                 :            : {
     919                 :            :   return typename ConstNColsBlockXpr<N>::Type(derived(), 0, cols() - n, rows(), n);
     920                 :            : }
     921                 :            : 
     922                 :            : 
     923                 :            : 
     924                 :            : /// \returns a block consisting of a range of columns of \c *this.
     925                 :            : ///
     926                 :            : /// \param startCol the index of the first column in the block
     927                 :            : /// \param numCols the number of columns in the block
     928                 :            : /// \tparam NColsType the type of the value handling the number of columns in the block, typically Index.
     929                 :            : ///
     930                 :            : /// Example: \include DenseBase_middleCols_int.cpp
     931                 :            : /// Output: \verbinclude DenseBase_middleCols_int.out
     932                 :            : ///
     933                 :            : /// The number of columns \a n can also be specified at compile-time by passing Eigen::fix<N>,
     934                 :            : /// or Eigen::fix<N>(n) as arguments.
     935                 :            : /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
     936                 :            : ///
     937                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
     938                 :            : ///
     939                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     940                 :            : ///
     941                 :            : template<typename NColsType>
     942                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     943                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     944                 :            : typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
     945                 :            : #else
     946                 :            : typename NColsBlockXpr<...>::Type
     947                 :            : #endif
     948                 :            : middleCols(Index startCol, NColsType numCols)
     949                 :            : {
     950                 :            :   return typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
     951                 :            :             (derived(), 0, startCol, rows(), internal::get_runtime_value(numCols));
     952                 :            : }
     953                 :            : 
     954                 :            : /// This is the const version of middleCols(Index,NColsType).
     955                 :            : template<typename NColsType>
     956                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     957                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     958                 :            : const typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
     959                 :            : #else
     960                 :            : const typename ConstNColsBlockXpr<...>::Type
     961                 :            : #endif
     962                 :            : middleCols(Index startCol, NColsType numCols) const
     963                 :            : {
     964                 :            :   return typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
     965                 :            :             (derived(), 0, startCol, rows(), internal::get_runtime_value(numCols));
     966                 :            : }
     967                 :            : 
     968                 :            : /// \returns a block consisting of a range of columns of \c *this.
     969                 :            : ///
     970                 :            : /// \tparam N the number of columns in the block as specified at compile-time
     971                 :            : /// \param startCol the index of the first column in the block
     972                 :            : /// \param n the number of columns in the block as specified at run-time
     973                 :            : ///
     974                 :            : /// The compile-time and run-time information should not contradict. In other words,
     975                 :            : /// \a n should equal \a N unless \a N is \a Dynamic.
     976                 :            : ///
     977                 :            : /// Example: \include DenseBase_template_int_middleCols.cpp
     978                 :            : /// Output: \verbinclude DenseBase_template_int_middleCols.out
     979                 :            : ///
     980                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
     981                 :            : ///
     982                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
     983                 :            : ///
     984                 :            : template<int N>
     985                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     986                 :            : typename NColsBlockXpr<N>::Type middleCols(Index startCol, Index n = N)
     987                 :            : {
     988                 :            :   return typename NColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), n);
     989                 :            : }
     990                 :            : 
     991                 :            : /// This is the const version of middleCols<int>().
     992                 :            : template<int N>
     993                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     994                 :            : typename ConstNColsBlockXpr<N>::Type middleCols(Index startCol, Index n = N) const
     995                 :            : {
     996                 :            :   return typename ConstNColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), n);
     997                 :            : }
     998                 :            : 
     999                 :            : 
    1000                 :            : 
    1001                 :            : /// \returns a fixed-size expression of a block of \c *this.
    1002                 :            : ///
    1003                 :            : /// The template parameters \a NRows and \a NCols are the number of
    1004                 :            : /// rows and columns in the block.
    1005                 :            : ///
    1006                 :            : /// \param startRow the first row in the block
    1007                 :            : /// \param startCol the first column in the block
    1008                 :            : ///
    1009                 :            : /// Example: \include MatrixBase_block_int_int.cpp
    1010                 :            : /// Output: \verbinclude MatrixBase_block_int_int.out
    1011                 :            : ///
    1012                 :            : /// \note The usage of of this overload is discouraged from %Eigen 3.4, better used the generic
    1013                 :            : /// block(Index,Index,NRowsType,NColsType), here is the one-to-one equivalence:
    1014                 :            : /// \code
    1015                 :            : /// mat.template block<NRows,NCols>(i,j)  <-->  mat.block(i,j,fix<NRows>,fix<NCols>)
    1016                 :            : /// \endcode
    1017                 :            : ///
    1018                 :            : /// \note since block is a templated member, the keyword template has to be used
    1019                 :            : /// if the matrix type is also a template parameter: \code m.template block<3,3>(1,1); \endcode
    1020                 :            : ///
    1021                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
    1022                 :            : ///
    1023                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
    1024                 :            : ///
    1025                 :            : template<int NRows, int NCols>
    1026                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1027                 :        306 : typename FixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol)
    1028                 :            : {
    1029                 :        306 :   return typename FixedBlockXpr<NRows,NCols>::Type(derived(), startRow, startCol);
    1030                 :            : }
    1031                 :            : 
    1032                 :            : /// This is the const version of block<>(Index, Index). */
    1033                 :            : template<int NRows, int NCols>
    1034                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1035                 :       9068 : const typename ConstFixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol) const
    1036                 :            : {
    1037                 :       9068 :   return typename ConstFixedBlockXpr<NRows,NCols>::Type(derived(), startRow, startCol);
    1038                 :            : }
    1039                 :            : 
    1040                 :            : /// \returns an expression of a block of \c *this.
    1041                 :            : ///
    1042                 :            : /// \tparam NRows number of rows in block as specified at compile-time
    1043                 :            : /// \tparam NCols number of columns in block as specified at compile-time
    1044                 :            : /// \param  startRow  the first row in the block
    1045                 :            : /// \param  startCol  the first column in the block
    1046                 :            : /// \param  blockRows number of rows in block as specified at run-time
    1047                 :            : /// \param  blockCols number of columns in block as specified at run-time
    1048                 :            : ///
    1049                 :            : /// This function is mainly useful for blocks where the number of rows is specified at compile-time
    1050                 :            : /// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
    1051                 :            : /// information should not contradict. In other words, \a blockRows should equal \a NRows unless
    1052                 :            : /// \a NRows is \a Dynamic, and the same for the number of columns.
    1053                 :            : ///
    1054                 :            : /// Example: \include MatrixBase_template_int_int_block_int_int_int_int.cpp
    1055                 :            : /// Output: \verbinclude MatrixBase_template_int_int_block_int_int_int_int.out
    1056                 :            : ///
    1057                 :            : /// \note The usage of of this overload is discouraged from %Eigen 3.4, better used the generic
    1058                 :            : /// block(Index,Index,NRowsType,NColsType), here is the one-to-one complete equivalence:
    1059                 :            : /// \code
    1060                 :            : /// mat.template block<NRows,NCols>(i,j,rows,cols)     <-->  mat.block(i,j,fix<NRows>(rows),fix<NCols>(cols))
    1061                 :            : /// \endcode
    1062                 :            : /// If we known that, e.g., NRows==Dynamic and NCols!=Dynamic, then the equivalence becomes:
    1063                 :            : /// \code
    1064                 :            : /// mat.template block<Dynamic,NCols>(i,j,rows,NCols)  <-->  mat.block(i,j,rows,fix<NCols>)
    1065                 :            : /// \endcode
    1066                 :            : ///
    1067                 :            : EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
    1068                 :            : ///
    1069                 :            : /// \sa block(Index,Index,NRowsType,NColsType), class Block
    1070                 :            : ///
    1071                 :            : template<int NRows, int NCols>
    1072                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1073                 :        306 : typename FixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol,
    1074                 :            :                                                   Index blockRows, Index blockCols)
    1075                 :            : {
    1076                 :        306 :   return typename FixedBlockXpr<NRows,NCols>::Type(derived(), startRow, startCol, blockRows, blockCols);
    1077                 :            : }
    1078                 :            : 
    1079                 :            : /// This is the const version of block<>(Index, Index, Index, Index).
    1080                 :            : template<int NRows, int NCols>
    1081                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1082                 :            : const typename ConstFixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol,
    1083                 :            :                                                               Index blockRows, Index blockCols) const
    1084                 :            : {
    1085                 :            :   return typename ConstFixedBlockXpr<NRows,NCols>::Type(derived(), startRow, startCol, blockRows, blockCols);
    1086                 :            : }
    1087                 :            : 
    1088                 :            : /// \returns an expression of the \a i-th column of \c *this. Note that the numbering starts at 0.
    1089                 :            : ///
    1090                 :            : /// Example: \include MatrixBase_col.cpp
    1091                 :            : /// Output: \verbinclude MatrixBase_col.out
    1092                 :            : ///
    1093                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
    1094                 :            : /**
    1095                 :            :   * \sa row(), class Block */
    1096                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1097                 :            : ColXpr col(Index i)
    1098                 :            : {
    1099                 :            :   return ColXpr(derived(), i);
    1100                 :            : }
    1101                 :            : 
    1102                 :            : /// This is the const version of col().
    1103                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1104                 :       3130 : ConstColXpr col(Index i) const
    1105                 :            : {
    1106                 :       3130 :   return ConstColXpr(derived(), i);
    1107                 :            : }
    1108                 :            : 
    1109                 :            : /// \returns an expression of the \a i-th row of \c *this. Note that the numbering starts at 0.
    1110                 :            : ///
    1111                 :            : /// Example: \include MatrixBase_row.cpp
    1112                 :            : /// Output: \verbinclude MatrixBase_row.out
    1113                 :            : ///
    1114                 :            : EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
    1115                 :            : /**
    1116                 :            :   * \sa col(), class Block */
    1117                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1118                 :            : RowXpr row(Index i)
    1119                 :            : {
    1120                 :            :   return RowXpr(derived(), i);
    1121                 :            : }
    1122                 :            : 
    1123                 :            : /// This is the const version of row(). */
    1124                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1125                 :       3130 : ConstRowXpr row(Index i) const
    1126                 :            : {
    1127                 :       3130 :   return ConstRowXpr(derived(), i);
    1128                 :            : }
    1129                 :            : 
    1130                 :            : /// \returns an expression of a segment (i.e. a vector block) in \c *this with either dynamic or fixed sizes.
    1131                 :            : ///
    1132                 :            : /// \only_for_vectors
    1133                 :            : ///
    1134                 :            : /// \param start the first coefficient in the segment
    1135                 :            : /// \param n the number of coefficients in the segment
    1136                 :            : /// \tparam NType the type of the value handling the number of coefficients in the segment, typically Index.
    1137                 :            : ///
    1138                 :            : /// Example: \include MatrixBase_segment_int_int.cpp
    1139                 :            : /// Output: \verbinclude MatrixBase_segment_int_int.out
    1140                 :            : ///
    1141                 :            : /// The number of coefficients \a n can also be specified at compile-time by passing Eigen::fix<N>,
    1142                 :            : /// or Eigen::fix<N>(n) as arguments.
    1143                 :            : /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
    1144                 :            : ///
    1145                 :            : /// \note Even in the case that the returned expression has dynamic size, in the case
    1146                 :            : /// when it is applied to a fixed-size vector, it inherits a fixed maximal size,
    1147                 :            : /// which means that evaluating it does not cause a dynamic memory allocation.
    1148                 :            : ///
    1149                 :            : /// \sa block(Index,Index,NRowsType,NColsType), fix<N>, fix<N>(int), class Block
    1150                 :            : ///
    1151                 :            : template<typename NType>
    1152                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1153                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
    1154                 :            : typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
    1155                 :            : #else
    1156                 :            : typename FixedSegmentReturnType<...>::Type
    1157                 :            : #endif
    1158                 :            : segment(Index start, NType n)
    1159                 :            : {
    1160                 :            :   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    1161                 :            :   return typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
    1162                 :            :             (derived(), start, internal::get_runtime_value(n));
    1163                 :            : }
    1164                 :            : 
    1165                 :            : 
    1166                 :            : /// This is the const version of segment(Index,NType).
    1167                 :            : template<typename NType>
    1168                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1169                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
    1170                 :            : const typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
    1171                 :            : #else
    1172                 :            : const typename ConstFixedSegmentReturnType<...>::Type
    1173                 :            : #endif
    1174                 :            : segment(Index start, NType n) const
    1175                 :            : {
    1176                 :            :   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    1177                 :            :   return typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
    1178                 :            :             (derived(), start, internal::get_runtime_value(n));
    1179                 :            : }
    1180                 :            : 
    1181                 :            : /// \returns an expression of the first coefficients of \c *this with either dynamic or fixed sizes.
    1182                 :            : ///
    1183                 :            : /// \only_for_vectors
    1184                 :            : ///
    1185                 :            : /// \param n the number of coefficients in the segment
    1186                 :            : /// \tparam NType the type of the value handling the number of coefficients in the segment, typically Index.
    1187                 :            : ///
    1188                 :            : /// Example: \include MatrixBase_start_int.cpp
    1189                 :            : /// Output: \verbinclude MatrixBase_start_int.out
    1190                 :            : ///
    1191                 :            : /// The number of coefficients \a n can also be specified at compile-time by passing Eigen::fix<N>,
    1192                 :            : /// or Eigen::fix<N>(n) as arguments.
    1193                 :            : /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
    1194                 :            : ///
    1195                 :            : /// \note Even in the case that the returned expression has dynamic size, in the case
    1196                 :            : /// when it is applied to a fixed-size vector, it inherits a fixed maximal size,
    1197                 :            : /// which means that evaluating it does not cause a dynamic memory allocation.
    1198                 :            : ///
    1199                 :            : /// \sa class Block, block(Index,Index)
    1200                 :            : ///
    1201                 :            : template<typename NType>
    1202                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1203                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
    1204                 :            : typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
    1205                 :            : #else
    1206                 :            : typename FixedSegmentReturnType<...>::Type
    1207                 :            : #endif
    1208                 :            : head(NType n)
    1209                 :            : {
    1210                 :            :   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    1211                 :            :   return typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
    1212                 :            :               (derived(), 0, internal::get_runtime_value(n));
    1213                 :            : }
    1214                 :            : 
    1215                 :            : /// This is the const version of head(NType).
    1216                 :            : template<typename NType>
    1217                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1218                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
    1219                 :            : const typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
    1220                 :            : #else
    1221                 :            : const typename ConstFixedSegmentReturnType<...>::Type
    1222                 :            : #endif
    1223                 :            : head(NType n) const
    1224                 :            : {
    1225                 :            :   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    1226                 :            :   return typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
    1227                 :            :             (derived(), 0, internal::get_runtime_value(n));
    1228                 :            : }
    1229                 :            : 
    1230                 :            : /// \returns an expression of a last coefficients of \c *this with either dynamic or fixed sizes.
    1231                 :            : ///
    1232                 :            : /// \only_for_vectors
    1233                 :            : ///
    1234                 :            : /// \param n the number of coefficients in the segment
    1235                 :            : /// \tparam NType the type of the value handling the number of coefficients in the segment, typically Index.
    1236                 :            : ///
    1237                 :            : /// Example: \include MatrixBase_end_int.cpp
    1238                 :            : /// Output: \verbinclude MatrixBase_end_int.out
    1239                 :            : ///
    1240                 :            : /// The number of coefficients \a n can also be specified at compile-time by passing Eigen::fix<N>,
    1241                 :            : /// or Eigen::fix<N>(n) as arguments.
    1242                 :            : /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
    1243                 :            : ///
    1244                 :            : /// \note Even in the case that the returned expression has dynamic size, in the case
    1245                 :            : /// when it is applied to a fixed-size vector, it inherits a fixed maximal size,
    1246                 :            : /// which means that evaluating it does not cause a dynamic memory allocation.
    1247                 :            : ///
    1248                 :            : /// \sa class Block, block(Index,Index)
    1249                 :            : ///
    1250                 :            : template<typename NType>
    1251                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1252                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
    1253                 :            : typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
    1254                 :            : #else
    1255                 :            : typename FixedSegmentReturnType<...>::Type
    1256                 :            : #endif
    1257                 :            : tail(NType n)
    1258                 :            : {
    1259                 :            :   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    1260                 :            :   return typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
    1261                 :            :             (derived(), this->size() - internal::get_runtime_value(n), internal::get_runtime_value(n));
    1262                 :            : }
    1263                 :            : 
    1264                 :            : /// This is the const version of tail(Index).
    1265                 :            : template<typename NType>
    1266                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1267                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
    1268                 :            : const typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
    1269                 :            : #else
    1270                 :            : const typename ConstFixedSegmentReturnType<...>::Type
    1271                 :            : #endif
    1272                 :            : tail(NType n) const
    1273                 :            : {
    1274                 :            :   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    1275                 :            :   return typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
    1276                 :            :             (derived(), this->size() - internal::get_runtime_value(n), internal::get_runtime_value(n));
    1277                 :            : }
    1278                 :            : 
    1279                 :            : /// \returns a fixed-size expression of a segment (i.e. a vector block) in \c *this
    1280                 :            : ///
    1281                 :            : /// \only_for_vectors
    1282                 :            : ///
    1283                 :            : /// \tparam N the number of coefficients in the segment as specified at compile-time
    1284                 :            : /// \param start the index of the first element in the segment
    1285                 :            : /// \param n the number of coefficients in the segment as specified at compile-time
    1286                 :            : ///
    1287                 :            : /// The compile-time and run-time information should not contradict. In other words,
    1288                 :            : /// \a n should equal \a N unless \a N is \a Dynamic.
    1289                 :            : ///
    1290                 :            : /// Example: \include MatrixBase_template_int_segment.cpp
    1291                 :            : /// Output: \verbinclude MatrixBase_template_int_segment.out
    1292                 :            : ///
    1293                 :            : /// \sa segment(Index,NType), class Block
    1294                 :            : ///
    1295                 :            : template<int N>
    1296                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1297                 :            : typename FixedSegmentReturnType<N>::Type segment(Index start, Index n = N)
    1298                 :            : {
    1299                 :            :   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    1300                 :            :   return typename FixedSegmentReturnType<N>::Type(derived(), start, n);
    1301                 :            : }
    1302                 :            : 
    1303                 :            : /// This is the const version of segment<int>(Index).
    1304                 :            : template<int N>
    1305                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1306                 :            : typename ConstFixedSegmentReturnType<N>::Type segment(Index start, Index n = N) const
    1307                 :            : {
    1308                 :            :   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    1309                 :            :   return typename ConstFixedSegmentReturnType<N>::Type(derived(), start, n);
    1310                 :            : }
    1311                 :            : 
    1312                 :            : /// \returns a fixed-size expression of the first coefficients of \c *this.
    1313                 :            : ///
    1314                 :            : /// \only_for_vectors
    1315                 :            : ///
    1316                 :            : /// \tparam N the number of coefficients in the segment as specified at compile-time
    1317                 :            : /// \param  n the number of coefficients in the segment as specified at run-time
    1318                 :            : ///
    1319                 :            : /// The compile-time and run-time information should not contradict. In other words,
    1320                 :            : /// \a n should equal \a N unless \a N is \a Dynamic.
    1321                 :            : ///
    1322                 :            : /// Example: \include MatrixBase_template_int_start.cpp
    1323                 :            : /// Output: \verbinclude MatrixBase_template_int_start.out
    1324                 :            : ///
    1325                 :            : /// \sa head(NType), class Block
    1326                 :            : ///
    1327                 :            : template<int N>
    1328                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1329                 :            : typename FixedSegmentReturnType<N>::Type head(Index n = N)
    1330                 :            : {
    1331                 :            :   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    1332                 :            :   return typename FixedSegmentReturnType<N>::Type(derived(), 0, n);
    1333                 :            : }
    1334                 :            : 
    1335                 :            : /// This is the const version of head<int>().
    1336                 :            : template<int N>
    1337                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1338                 :       2000 : typename ConstFixedSegmentReturnType<N>::Type head(Index n = N) const
    1339                 :            : {
    1340                 :            :   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    1341                 :       2000 :   return typename ConstFixedSegmentReturnType<N>::Type(derived(), 0, n);
    1342                 :            : }
    1343                 :            : 
    1344                 :            : /// \returns a fixed-size expression of the last coefficients of \c *this.
    1345                 :            : ///
    1346                 :            : /// \only_for_vectors
    1347                 :            : ///
    1348                 :            : /// \tparam N the number of coefficients in the segment as specified at compile-time
    1349                 :            : /// \param  n the number of coefficients in the segment as specified at run-time
    1350                 :            : ///
    1351                 :            : /// The compile-time and run-time information should not contradict. In other words,
    1352                 :            : /// \a n should equal \a N unless \a N is \a Dynamic.
    1353                 :            : ///
    1354                 :            : /// Example: \include MatrixBase_template_int_end.cpp
    1355                 :            : /// Output: \verbinclude MatrixBase_template_int_end.out
    1356                 :            : ///
    1357                 :            : /// \sa tail(NType), class Block
    1358                 :            : ///
    1359                 :            : template<int N>
    1360                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1361                 :            : typename FixedSegmentReturnType<N>::Type tail(Index n = N)
    1362                 :            : {
    1363                 :            :   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    1364                 :            :   return typename FixedSegmentReturnType<N>::Type(derived(), size() - n);
    1365                 :            : }
    1366                 :            : 
    1367                 :            : /// This is the const version of tail<int>.
    1368                 :            : template<int N>
    1369                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1370                 :            : typename ConstFixedSegmentReturnType<N>::Type tail(Index n = N) const
    1371                 :            : {
    1372                 :            :   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
    1373                 :            :   return typename ConstFixedSegmentReturnType<N>::Type(derived(), size() - n);
    1374                 :            : }
    1375                 :            : 
    1376                 :            : /// \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
    1377                 :            : /// is col-major (resp. row-major).
    1378                 :            : ///
    1379                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1380                 :            : InnerVectorReturnType innerVector(Index outer)
    1381                 :            : { return InnerVectorReturnType(derived(), outer); }
    1382                 :            : 
    1383                 :            : /// \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
    1384                 :            : /// is col-major (resp. row-major). Read-only.
    1385                 :            : ///
    1386                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1387                 :            : const ConstInnerVectorReturnType innerVector(Index outer) const
    1388                 :            : { return ConstInnerVectorReturnType(derived(), outer); }
    1389                 :            : 
    1390                 :            : /// \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
    1391                 :            : /// is col-major (resp. row-major).
    1392                 :            : ///
    1393                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1394                 :            : InnerVectorsReturnType
    1395                 :            : innerVectors(Index outerStart, Index outerSize)
    1396                 :            : {
    1397                 :            :   return Block<Derived,Dynamic,Dynamic,true>(derived(),
    1398                 :            :                                              IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,
    1399                 :            :                                              IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);
    1400                 :            : 
    1401                 :            : }
    1402                 :            : 
    1403                 :            : /// \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
    1404                 :            : /// is col-major (resp. row-major). Read-only.
    1405                 :            : ///
    1406                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1407                 :            : const ConstInnerVectorsReturnType
    1408                 :            : innerVectors(Index outerStart, Index outerSize) const
    1409                 :            : {
    1410                 :            :   return Block<const Derived,Dynamic,Dynamic,true>(derived(),
    1411                 :            :                                                   IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,
    1412                 :            :                                                   IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);
    1413                 :            : 
    1414                 :            : }
    1415                 :            : 
    1416                 :            : /** \returns the i-th subvector (column or vector) according to the \c Direction
    1417                 :            :   * \sa subVectors()
    1418                 :            :   */
    1419                 :            : template<DirectionType Direction>
    1420                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1421                 :            : typename internal::conditional<Direction==Vertical,ColXpr,RowXpr>::type
    1422                 :            : subVector(Index i)
    1423                 :            : {
    1424                 :            :   return typename internal::conditional<Direction==Vertical,ColXpr,RowXpr>::type(derived(),i);
    1425                 :            : }
    1426                 :            : 
    1427                 :            : /** This is the const version of subVector(Index) */
    1428                 :            : template<DirectionType Direction>
    1429                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
    1430                 :            : typename internal::conditional<Direction==Vertical,ConstColXpr,ConstRowXpr>::type
    1431                 :            : subVector(Index i) const
    1432                 :            : {
    1433                 :            :   return typename internal::conditional<Direction==Vertical,ConstColXpr,ConstRowXpr>::type(derived(),i);
    1434                 :            : }
    1435                 :            : 
    1436                 :            : /** \returns the number of subvectors (rows or columns) in the direction \c Direction
    1437                 :            :   * \sa subVector(Index)
    1438                 :            :   */
    1439                 :            : template<DirectionType Direction>
    1440                 :            : EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
    1441                 :            : Index subVectors() const
    1442                 :            : { return (Direction==Vertical)?cols():rows(); }

Generated by: LCOV version 1.0