2010-08-25 13:09:56 +02:00
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
//
2012-07-13 14:42:47 -04:00
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
2010-08-25 13:09:56 +02:00
# ifndef EIGEN_PARSED_BY_DOXYGEN
2016-09-16 11:23:19 +02:00
/// \internal expression type of a column */
2010-10-25 10:15:22 -04:00
typedef Block < Derived , internal : : traits < Derived > : : RowsAtCompileTime , 1 , ! IsRowMajor > ColXpr ;
2010-12-22 17:45:37 -05:00
typedef const Block < const Derived , internal : : traits < Derived > : : RowsAtCompileTime , 1 , ! IsRowMajor > ConstColXpr ;
2016-09-16 11:23:19 +02:00
/// \internal expression type of a row */
2010-10-25 10:15:22 -04:00
typedef Block < Derived , 1 , internal : : traits < Derived > : : ColsAtCompileTime , IsRowMajor > RowXpr ;
2010-12-22 17:45:37 -05:00
typedef const Block < const Derived , 1 , internal : : traits < Derived > : : ColsAtCompileTime , IsRowMajor > ConstRowXpr ;
2016-09-16 11:23:19 +02:00
/// \internal expression type of a block of whole columns */
2010-10-25 10:15:22 -04:00
typedef Block < Derived , internal : : traits < Derived > : : RowsAtCompileTime , Dynamic , ! IsRowMajor > ColsBlockXpr ;
2010-12-22 17:45:37 -05:00
typedef const Block < const Derived , internal : : traits < Derived > : : RowsAtCompileTime , Dynamic , ! IsRowMajor > ConstColsBlockXpr ;
2016-09-16 11:23:19 +02:00
/// \internal expression type of a block of whole rows */
2010-10-25 10:15:22 -04:00
typedef Block < Derived , Dynamic , internal : : traits < Derived > : : ColsAtCompileTime , IsRowMajor > RowsBlockXpr ;
2010-12-22 17:45:37 -05:00
typedef const Block < const Derived , Dynamic , internal : : traits < Derived > : : ColsAtCompileTime , IsRowMajor > ConstRowsBlockXpr ;
2016-09-16 11:23:19 +02:00
/// \internal expression type of a block of whole columns */
2010-10-25 10:15:22 -04:00
template < int N > struct NColsBlockXpr { typedef Block < Derived , internal : : traits < Derived > : : RowsAtCompileTime , N , ! IsRowMajor > Type ; } ;
2010-12-22 17:45:37 -05:00
template < int N > struct ConstNColsBlockXpr { typedef const Block < const Derived , internal : : traits < Derived > : : RowsAtCompileTime , N , ! IsRowMajor > Type ; } ;
2016-09-16 11:23:19 +02:00
/// \internal expression type of a block of whole rows */
2010-10-25 10:15:22 -04:00
template < int N > struct NRowsBlockXpr { typedef Block < Derived , N , internal : : traits < Derived > : : ColsAtCompileTime , IsRowMajor > Type ; } ;
2010-12-22 17:45:37 -05:00
template < int N > struct ConstNRowsBlockXpr { typedef const Block < const Derived , N , internal : : traits < Derived > : : ColsAtCompileTime , IsRowMajor > Type ; } ;
2016-09-16 11:23:19 +02:00
/// \internal expression of a block */
2016-02-19 22:15:01 +01:00
typedef Block < Derived > BlockXpr ;
typedef const Block < const Derived > ConstBlockXpr ;
2016-09-16 11:23:19 +02:00
/// \internal expression of a block of fixed sizes */
2016-02-19 22:15:01 +01:00
template < int Rows , int Cols > struct FixedBlockXpr { typedef Block < Derived , Rows , Cols > Type ; } ;
template < int Rows , int Cols > struct ConstFixedBlockXpr { typedef Block < const Derived , Rows , Cols > Type ; } ;
2010-08-25 13:09:56 +02:00
2012-11-16 19:59:11 +01:00
typedef VectorBlock < Derived > SegmentReturnType ;
typedef const VectorBlock < const Derived > ConstSegmentReturnType ;
template < int Size > struct FixedSegmentReturnType { typedef VectorBlock < Derived , Size > Type ; } ;
template < int Size > struct ConstFixedSegmentReturnType { typedef const VectorBlock < const Derived , Size > Type ; } ;
2010-08-25 13:09:56 +02:00
# endif // not EIGEN_PARSED_BY_DOXYGEN
2016-09-16 11:23:19 +02:00
/// \returns a dynamic-size expression of a block in *this.
///
/// \param startRow the first row in the block
/// \param startCol the first column in the block
/// \param blockRows the number of rows in the block
/// \param blockCols the number of columns in the block
///
/// Example: \include MatrixBase_block_int_int_int_int.cpp
/// Output: \verbinclude MatrixBase_block_int_int_int_int.out
///
/// \note Even though the returned expression has dynamic size, in the case
/// when it is applied to a fixed-size matrix, it inherits a fixed maximal size,
/// which means that evaluating it does not cause a dynamic memory allocation.
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block, block(Index,Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline BlockXpr block ( Index startRow , Index startCol , Index blockRows , Index blockCols )
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return BlockXpr ( derived ( ) , startRow , startCol , blockRows , blockCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of block(Index,Index,Index,Index). */
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline const ConstBlockXpr block ( Index startRow , Index startCol , Index blockRows , Index blockCols ) const
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return ConstBlockXpr ( derived ( ) , startRow , startCol , blockRows , blockCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns a dynamic-size expression of a top-right corner of *this.
///
/// \param cRows the number of rows in the corner
/// \param cCols the number of columns in the corner
///
/// Example: \include MatrixBase_topRightCorner_int_int.cpp
/// Output: \verbinclude MatrixBase_topRightCorner_int_int.out
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline BlockXpr topRightCorner ( Index cRows , Index cCols )
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return BlockXpr ( derived ( ) , 0 , cols ( ) - cCols , cRows , cCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of topRightCorner(Index, Index).
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline const ConstBlockXpr topRightCorner ( Index cRows , Index cCols ) const
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return ConstBlockXpr ( derived ( ) , 0 , cols ( ) - cCols , cRows , cCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns an expression of a fixed-size top-right corner of *this.
///
/// \tparam CRows the number of rows in the corner
/// \tparam CCols the number of columns in the corner
///
/// Example: \include MatrixBase_template_int_int_topRightCorner.cpp
/// Output: \verbinclude MatrixBase_template_int_int_topRightCorner.out
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block, block<int,int>(Index,Index)
///
2010-08-25 13:09:56 +02:00
template < int CRows , int CCols >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline typename FixedBlockXpr < CRows , CCols > : : Type topRightCorner ( )
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return typename FixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , 0 , cols ( ) - CCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of topRightCorner<int, int>().
2010-08-25 13:09:56 +02:00
template < int CRows , int CCols >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline const typename ConstFixedBlockXpr < CRows , CCols > : : Type topRightCorner ( ) const
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return typename ConstFixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , 0 , cols ( ) - CCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns an expression of a top-right corner of *this.
///
/// \tparam CRows number of rows in corner as specified at compile-time
/// \tparam CCols number of columns in corner as specified at compile-time
/// \param cRows number of rows in corner as specified at run-time
/// \param cCols number of columns in corner as specified at run-time
///
/// This function is mainly useful for corners where the number of rows is specified at compile-time
/// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
/// information should not contradict. In other words, \a cRows should equal \a CRows unless
/// \a CRows is \a Dynamic, and the same for the number of columns.
///
/// Example: \include MatrixBase_template_int_int_topRightCorner_int_int.cpp
/// Output: \verbinclude MatrixBase_template_int_int_topRightCorner_int_int.out
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block
///
2013-06-18 14:29:15 +01:00
template < int CRows , int CCols >
2016-02-19 22:15:01 +01:00
inline typename FixedBlockXpr < CRows , CCols > : : Type topRightCorner ( Index cRows , Index cCols )
2013-06-18 14:29:15 +01:00
{
2016-02-19 22:15:01 +01:00
return typename FixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , 0 , cols ( ) - cCols , cRows , cCols ) ;
2013-06-18 14:29:15 +01:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of topRightCorner<int, int>(Index, Index).
2013-06-18 14:29:15 +01:00
template < int CRows , int CCols >
2016-02-19 22:15:01 +01:00
inline const typename ConstFixedBlockXpr < CRows , CCols > : : Type topRightCorner ( Index cRows , Index cCols ) const
2013-06-18 14:29:15 +01:00
{
2016-02-19 22:15:01 +01:00
return typename ConstFixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , 0 , cols ( ) - cCols , cRows , cCols ) ;
2013-06-18 14:29:15 +01:00
}
2010-08-25 13:09:56 +02:00
2016-09-16 11:23:19 +02:00
/// \returns a dynamic-size expression of a top-left corner of *this.
///
/// \param cRows the number of rows in the corner
/// \param cCols the number of columns in the corner
///
/// Example: \include MatrixBase_topLeftCorner_int_int.cpp
/// Output: \verbinclude MatrixBase_topLeftCorner_int_int.out
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline BlockXpr topLeftCorner ( Index cRows , Index cCols )
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return BlockXpr ( derived ( ) , 0 , 0 , cRows , cCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of topLeftCorner(Index, Index).
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline const ConstBlockXpr topLeftCorner ( Index cRows , Index cCols ) const
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return ConstBlockXpr ( derived ( ) , 0 , 0 , cRows , cCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns an expression of a fixed-size top-left corner of *this.
///
/// The template parameters CRows and CCols are the number of rows and columns in the corner.
///
/// Example: \include MatrixBase_template_int_int_topLeftCorner.cpp
/// Output: \verbinclude MatrixBase_template_int_int_topLeftCorner.out
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2010-08-25 13:09:56 +02:00
template < int CRows , int CCols >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline typename FixedBlockXpr < CRows , CCols > : : Type topLeftCorner ( )
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return typename FixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , 0 , 0 ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of topLeftCorner<int, int>().
2010-08-25 13:09:56 +02:00
template < int CRows , int CCols >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline const typename ConstFixedBlockXpr < CRows , CCols > : : Type topLeftCorner ( ) const
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return typename ConstFixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , 0 , 0 ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns an expression of a top-left corner of *this.
///
/// \tparam CRows number of rows in corner as specified at compile-time
/// \tparam CCols number of columns in corner as specified at compile-time
/// \param cRows number of rows in corner as specified at run-time
/// \param cCols number of columns in corner as specified at run-time
///
/// This function is mainly useful for corners where the number of rows is specified at compile-time
/// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
/// information should not contradict. In other words, \a cRows should equal \a CRows unless
/// \a CRows is \a Dynamic, and the same for the number of columns.
///
/// Example: \include MatrixBase_template_int_int_topLeftCorner_int_int.cpp
/// Output: \verbinclude MatrixBase_template_int_int_topLeftCorner_int_int.out
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block
///
2013-06-18 14:29:15 +01:00
template < int CRows , int CCols >
2016-02-19 22:15:01 +01:00
inline typename FixedBlockXpr < CRows , CCols > : : Type topLeftCorner ( Index cRows , Index cCols )
2013-06-18 14:29:15 +01:00
{
2016-02-19 22:15:01 +01:00
return typename FixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , 0 , 0 , cRows , cCols ) ;
2013-06-18 14:29:15 +01:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of topLeftCorner<int, int>(Index, Index).
2013-06-18 14:29:15 +01:00
template < int CRows , int CCols >
2016-02-19 22:15:01 +01:00
inline const typename ConstFixedBlockXpr < CRows , CCols > : : Type topLeftCorner ( Index cRows , Index cCols ) const
2013-06-18 14:29:15 +01:00
{
2016-02-19 22:15:01 +01:00
return typename ConstFixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , 0 , 0 , cRows , cCols ) ;
2013-06-18 14:29:15 +01:00
}
2010-08-25 13:09:56 +02:00
2016-09-16 11:23:19 +02:00
/// \returns a dynamic-size expression of a bottom-right corner of *this.
///
/// \param cRows the number of rows in the corner
/// \param cCols the number of columns in the corner
///
/// Example: \include MatrixBase_bottomRightCorner_int_int.cpp
/// Output: \verbinclude MatrixBase_bottomRightCorner_int_int.out
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline BlockXpr bottomRightCorner ( Index cRows , Index cCols )
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return BlockXpr ( derived ( ) , rows ( ) - cRows , cols ( ) - cCols , cRows , cCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of bottomRightCorner(Index, Index).
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline const ConstBlockXpr bottomRightCorner ( Index cRows , Index cCols ) const
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return ConstBlockXpr ( derived ( ) , rows ( ) - cRows , cols ( ) - cCols , cRows , cCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns an expression of a fixed-size bottom-right corner of *this.
///
/// The template parameters CRows and CCols are the number of rows and columns in the corner.
///
/// Example: \include MatrixBase_template_int_int_bottomRightCorner.cpp
/// Output: \verbinclude MatrixBase_template_int_int_bottomRightCorner.out
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2010-08-25 13:09:56 +02:00
template < int CRows , int CCols >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline typename FixedBlockXpr < CRows , CCols > : : Type bottomRightCorner ( )
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return typename FixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , rows ( ) - CRows , cols ( ) - CCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of bottomRightCorner<int, int>().
2010-08-25 13:09:56 +02:00
template < int CRows , int CCols >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline const typename ConstFixedBlockXpr < CRows , CCols > : : Type bottomRightCorner ( ) const
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return typename ConstFixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , rows ( ) - CRows , cols ( ) - CCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns an expression of a bottom-right corner of *this.
///
/// \tparam CRows number of rows in corner as specified at compile-time
/// \tparam CCols number of columns in corner as specified at compile-time
/// \param cRows number of rows in corner as specified at run-time
/// \param cCols number of columns in corner as specified at run-time
///
/// This function is mainly useful for corners where the number of rows is specified at compile-time
/// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
/// information should not contradict. In other words, \a cRows should equal \a CRows unless
/// \a CRows is \a Dynamic, and the same for the number of columns.
///
/// Example: \include MatrixBase_template_int_int_bottomRightCorner_int_int.cpp
/// Output: \verbinclude MatrixBase_template_int_int_bottomRightCorner_int_int.out
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block
///
2013-06-18 14:29:15 +01:00
template < int CRows , int CCols >
2016-02-19 22:15:01 +01:00
inline typename FixedBlockXpr < CRows , CCols > : : Type bottomRightCorner ( Index cRows , Index cCols )
2013-06-18 14:29:15 +01:00
{
2016-02-19 22:15:01 +01:00
return typename FixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , rows ( ) - cRows , cols ( ) - cCols , cRows , cCols ) ;
2013-06-18 14:29:15 +01:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of bottomRightCorner<int, int>(Index, Index).
2013-06-18 14:29:15 +01:00
template < int CRows , int CCols >
2016-02-19 22:15:01 +01:00
inline const typename ConstFixedBlockXpr < CRows , CCols > : : Type bottomRightCorner ( Index cRows , Index cCols ) const
2013-06-18 14:29:15 +01:00
{
2016-02-19 22:15:01 +01:00
return typename ConstFixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , rows ( ) - cRows , cols ( ) - cCols , cRows , cCols ) ;
2013-06-18 14:29:15 +01:00
}
2010-08-25 13:09:56 +02:00
2016-09-16 11:23:19 +02:00
/// \returns a dynamic-size expression of a bottom-left corner of *this.
///
/// \param cRows the number of rows in the corner
/// \param cCols the number of columns in the corner
///
/// Example: \include MatrixBase_bottomLeftCorner_int_int.cpp
/// Output: \verbinclude MatrixBase_bottomLeftCorner_int_int.out
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline BlockXpr bottomLeftCorner ( Index cRows , Index cCols )
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return BlockXpr ( derived ( ) , rows ( ) - cRows , 0 , cRows , cCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of bottomLeftCorner(Index, Index).
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline const ConstBlockXpr bottomLeftCorner ( Index cRows , Index cCols ) const
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return ConstBlockXpr ( derived ( ) , rows ( ) - cRows , 0 , cRows , cCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns an expression of a fixed-size bottom-left corner of *this.
///
/// The template parameters CRows and CCols are the number of rows and columns in the corner.
///
/// Example: \include MatrixBase_template_int_int_bottomLeftCorner.cpp
/// Output: \verbinclude MatrixBase_template_int_int_bottomLeftCorner.out
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2010-08-25 13:09:56 +02:00
template < int CRows , int CCols >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline typename FixedBlockXpr < CRows , CCols > : : Type bottomLeftCorner ( )
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return typename FixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , rows ( ) - CRows , 0 ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of bottomLeftCorner<int, int>().
2010-08-25 13:09:56 +02:00
template < int CRows , int CCols >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline const typename ConstFixedBlockXpr < CRows , CCols > : : Type bottomLeftCorner ( ) const
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return typename ConstFixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , rows ( ) - CRows , 0 ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns an expression of a bottom-left corner of *this.
///
/// \tparam CRows number of rows in corner as specified at compile-time
/// \tparam CCols number of columns in corner as specified at compile-time
/// \param cRows number of rows in corner as specified at run-time
/// \param cCols number of columns in corner as specified at run-time
///
/// This function is mainly useful for corners where the number of rows is specified at compile-time
/// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
/// information should not contradict. In other words, \a cRows should equal \a CRows unless
/// \a CRows is \a Dynamic, and the same for the number of columns.
///
/// Example: \include MatrixBase_template_int_int_bottomLeftCorner_int_int.cpp
/// Output: \verbinclude MatrixBase_template_int_int_bottomLeftCorner_int_int.out
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block
///
2013-06-18 14:29:15 +01:00
template < int CRows , int CCols >
2016-02-19 22:15:01 +01:00
inline typename FixedBlockXpr < CRows , CCols > : : Type bottomLeftCorner ( Index cRows , Index cCols )
2013-06-18 14:29:15 +01:00
{
2016-02-19 22:15:01 +01:00
return typename FixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , rows ( ) - cRows , 0 , cRows , cCols ) ;
2013-06-18 14:29:15 +01:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of bottomLeftCorner<int, int>(Index, Index).
2013-06-18 14:29:15 +01:00
template < int CRows , int CCols >
2016-02-19 22:15:01 +01:00
inline const typename ConstFixedBlockXpr < CRows , CCols > : : Type bottomLeftCorner ( Index cRows , Index cCols ) const
2013-06-18 14:29:15 +01:00
{
2016-02-19 22:15:01 +01:00
return typename ConstFixedBlockXpr < CRows , CCols > : : Type ( derived ( ) , rows ( ) - cRows , 0 , cRows , cCols ) ;
2013-06-18 14:29:15 +01:00
}
2010-08-25 13:09:56 +02:00
2016-09-16 11:23:19 +02:00
/// \returns a block consisting of the top rows of *this.
///
/// \param n the number of rows in the block
///
/// Example: \include MatrixBase_topRows_int.cpp
/// Output: \verbinclude MatrixBase_topRows_int.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( row - major )
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-08-25 13:09:56 +02:00
inline RowsBlockXpr topRows ( Index n )
{
return RowsBlockXpr ( derived ( ) , 0 , 0 , n , cols ( ) ) ;
}
2016-09-16 11:23:19 +02:00
/// This is the const version of topRows(Index).
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-12-22 17:45:37 -05:00
inline ConstRowsBlockXpr topRows ( Index n ) const
2010-08-25 13:09:56 +02:00
{
2010-12-22 17:45:37 -05:00
return ConstRowsBlockXpr ( derived ( ) , 0 , 0 , n , cols ( ) ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns a block consisting of the top rows of *this.
///
/// \tparam N the number of rows in the block as specified at compile-time
/// \param n the number of rows in the block as specified at run-time
///
/// The compile-time and run-time information should not contradict. In other words,
/// \a n should equal \a N unless \a N is \a Dynamic.
///
/// Example: \include MatrixBase_template_int_topRows.cpp
/// Output: \verbinclude MatrixBase_template_int_topRows.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( row - major )
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2010-08-25 13:09:56 +02:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename NRowsBlockXpr < N > : : Type topRows ( Index n = N )
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return typename NRowsBlockXpr < N > : : Type ( derived ( ) , 0 , 0 , n , cols ( ) ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of topRows<int>().
2010-08-25 13:09:56 +02:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename ConstNRowsBlockXpr < N > : : Type topRows ( Index n = N ) const
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return typename ConstNRowsBlockXpr < N > : : Type ( derived ( ) , 0 , 0 , n , cols ( ) ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns a block consisting of the bottom rows of *this.
///
/// \param n the number of rows in the block
///
/// Example: \include MatrixBase_bottomRows_int.cpp
/// Output: \verbinclude MatrixBase_bottomRows_int.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( row - major )
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-08-25 13:09:56 +02:00
inline RowsBlockXpr bottomRows ( Index n )
{
return RowsBlockXpr ( derived ( ) , rows ( ) - n , 0 , n , cols ( ) ) ;
}
2016-09-16 11:23:19 +02:00
/// This is the const version of bottomRows(Index).
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-12-22 17:45:37 -05:00
inline ConstRowsBlockXpr bottomRows ( Index n ) const
2010-08-25 13:09:56 +02:00
{
2010-12-22 17:45:37 -05:00
return ConstRowsBlockXpr ( derived ( ) , rows ( ) - n , 0 , n , cols ( ) ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns a block consisting of the bottom rows of *this.
///
/// \tparam N the number of rows in the block as specified at compile-time
/// \param n the number of rows in the block as specified at run-time
///
/// The compile-time and run-time information should not contradict. In other words,
/// \a n should equal \a N unless \a N is \a Dynamic.
///
/// Example: \include MatrixBase_template_int_bottomRows.cpp
/// Output: \verbinclude MatrixBase_template_int_bottomRows.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( row - major )
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2010-08-25 13:09:56 +02:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename NRowsBlockXpr < N > : : Type bottomRows ( Index n = N )
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return typename NRowsBlockXpr < N > : : Type ( derived ( ) , rows ( ) - n , 0 , n , cols ( ) ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of bottomRows<int>().
2010-08-25 13:09:56 +02:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename ConstNRowsBlockXpr < N > : : Type bottomRows ( Index n = N ) const
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return typename ConstNRowsBlockXpr < N > : : Type ( derived ( ) , rows ( ) - n , 0 , n , cols ( ) ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns a block consisting of a range of rows of *this.
///
/// \param startRow the index of the first row in the block
/// \param n the number of rows in the block
///
/// Example: \include DenseBase_middleRows_int.cpp
/// Output: \verbinclude DenseBase_middleRows_int.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( row - major )
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline RowsBlockXpr middleRows ( Index startRow , Index n )
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return RowsBlockXpr ( derived ( ) , startRow , 0 , n , cols ( ) ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of middleRows(Index,Index).
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline ConstRowsBlockXpr middleRows ( Index startRow , Index n ) const
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return ConstRowsBlockXpr ( derived ( ) , startRow , 0 , n , cols ( ) ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns a block consisting of a range of rows of *this.
///
/// \tparam N the number of rows in the block as specified at compile-time
/// \param startRow the index of the first row in the block
/// \param n the number of rows in the block as specified at run-time
///
/// The compile-time and run-time information should not contradict. In other words,
/// \a n should equal \a N unless \a N is \a Dynamic.
///
/// Example: \include DenseBase_template_int_middleRows.cpp
/// Output: \verbinclude DenseBase_template_int_middleRows.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( row - major )
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2010-08-25 13:09:56 +02:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename NRowsBlockXpr < N > : : Type middleRows ( Index startRow , Index n = N )
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return typename NRowsBlockXpr < N > : : Type ( derived ( ) , startRow , 0 , n , cols ( ) ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of middleRows<int>().
2010-08-25 13:09:56 +02:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename ConstNRowsBlockXpr < N > : : Type middleRows ( Index startRow , Index n = N ) const
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return typename ConstNRowsBlockXpr < N > : : Type ( derived ( ) , startRow , 0 , n , cols ( ) ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns a block consisting of the left columns of *this.
///
/// \param n the number of columns in the block
///
/// Example: \include MatrixBase_leftCols_int.cpp
/// Output: \verbinclude MatrixBase_leftCols_int.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( column - major )
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-08-25 13:09:56 +02:00
inline ColsBlockXpr leftCols ( Index n )
{
return ColsBlockXpr ( derived ( ) , 0 , 0 , rows ( ) , n ) ;
}
2016-09-16 11:23:19 +02:00
/// This is the const version of leftCols(Index).
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-12-22 17:45:37 -05:00
inline ConstColsBlockXpr leftCols ( Index n ) const
2010-08-25 13:09:56 +02:00
{
2010-12-22 17:45:37 -05:00
return ConstColsBlockXpr ( derived ( ) , 0 , 0 , rows ( ) , n ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns a block consisting of the left columns of *this.
///
/// \tparam N the number of columns in the block as specified at compile-time
/// \param n the number of columns in the block as specified at run-time
///
/// The compile-time and run-time information should not contradict. In other words,
/// \a n should equal \a N unless \a N is \a Dynamic.
///
/// Example: \include MatrixBase_template_int_leftCols.cpp
/// Output: \verbinclude MatrixBase_template_int_leftCols.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( column - major )
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2010-08-25 13:09:56 +02:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename NColsBlockXpr < N > : : Type leftCols ( Index n = N )
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return typename NColsBlockXpr < N > : : Type ( derived ( ) , 0 , 0 , rows ( ) , n ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of leftCols<int>().
2010-08-25 13:09:56 +02:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename ConstNColsBlockXpr < N > : : Type leftCols ( Index n = N ) const
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return typename ConstNColsBlockXpr < N > : : Type ( derived ( ) , 0 , 0 , rows ( ) , n ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns a block consisting of the right columns of *this.
///
/// \param n the number of columns in the block
///
/// Example: \include MatrixBase_rightCols_int.cpp
/// Output: \verbinclude MatrixBase_rightCols_int.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( column - major )
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-08-25 13:09:56 +02:00
inline ColsBlockXpr rightCols ( Index n )
{
return ColsBlockXpr ( derived ( ) , 0 , cols ( ) - n , rows ( ) , n ) ;
}
2016-09-16 11:23:19 +02:00
/// This is the const version of rightCols(Index).
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-12-22 17:45:37 -05:00
inline ConstColsBlockXpr rightCols ( Index n ) const
2010-08-25 13:09:56 +02:00
{
2010-12-22 17:45:37 -05:00
return ConstColsBlockXpr ( derived ( ) , 0 , cols ( ) - n , rows ( ) , n ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns a block consisting of the right columns of *this.
///
/// \tparam N the number of columns in the block as specified at compile-time
/// \param n the number of columns in the block as specified at run-time
///
/// The compile-time and run-time information should not contradict. In other words,
/// \a n should equal \a N unless \a N is \a Dynamic.
///
/// Example: \include MatrixBase_template_int_rightCols.cpp
/// Output: \verbinclude MatrixBase_template_int_rightCols.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( column - major )
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2010-08-25 13:09:56 +02:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename NColsBlockXpr < N > : : Type rightCols ( Index n = N )
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return typename NColsBlockXpr < N > : : Type ( derived ( ) , 0 , cols ( ) - n , rows ( ) , n ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of rightCols<int>().
2010-08-25 13:09:56 +02:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename ConstNColsBlockXpr < N > : : Type rightCols ( Index n = N ) const
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return typename ConstNColsBlockXpr < N > : : Type ( derived ( ) , 0 , cols ( ) - n , rows ( ) , n ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns a block consisting of a range of columns of *this.
///
/// \param startCol the index of the first column in the block
/// \param numCols the number of columns in the block
///
/// Example: \include DenseBase_middleCols_int.cpp
/// Output: \verbinclude DenseBase_middleCols_int.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( column - major )
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-08-25 13:09:56 +02:00
inline ColsBlockXpr middleCols ( Index startCol , Index numCols )
{
return ColsBlockXpr ( derived ( ) , 0 , startCol , rows ( ) , numCols ) ;
}
2016-09-16 11:23:19 +02:00
/// This is the const version of middleCols(Index,Index).
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-12-22 17:45:37 -05:00
inline ConstColsBlockXpr middleCols ( Index startCol , Index numCols ) const
2010-08-25 13:09:56 +02:00
{
2010-12-22 17:45:37 -05:00
return ConstColsBlockXpr ( derived ( ) , 0 , startCol , rows ( ) , numCols ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns a block consisting of a range of columns of *this.
///
/// \tparam N the number of columns in the block as specified at compile-time
/// \param startCol the index of the first column in the block
/// \param n the number of columns in the block as specified at run-time
///
/// The compile-time and run-time information should not contradict. In other words,
/// \a n should equal \a N unless \a N is \a Dynamic.
///
/// Example: \include DenseBase_template_int_middleCols.cpp
/// Output: \verbinclude DenseBase_template_int_middleCols.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( column - major )
///
/// \sa class Block, block(Index,Index,Index,Index)
///
2010-08-25 13:09:56 +02:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename NColsBlockXpr < N > : : Type middleCols ( Index startCol , Index n = N )
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return typename NColsBlockXpr < N > : : Type ( derived ( ) , 0 , startCol , rows ( ) , n ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of middleCols<int>().
2010-08-25 13:09:56 +02:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename ConstNColsBlockXpr < N > : : Type middleCols ( Index startCol , Index n = N ) const
2010-08-25 13:09:56 +02:00
{
2013-12-21 21:46:27 +01:00
return typename ConstNColsBlockXpr < N > : : Type ( derived ( ) , 0 , startCol , rows ( ) , n ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns a fixed-size expression of a block in *this.
///
/// The template parameters \a NRows and \a NCols are the number of
/// rows and columns in the block.
///
/// \param startRow the first row in the block
/// \param startCol the first column in the block
///
/// Example: \include MatrixBase_block_int_int.cpp
/// Output: \verbinclude MatrixBase_block_int_int.out
///
/// \note since block is a templated member, the keyword template has to be used
/// if the matrix type is also a template parameter: \code m.template block<3,3>(1,1); \endcode
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
2017-01-17 11:34:28 +01:00
/// \sa block(Index,Index,NRowsType,NColsType), class Block, block(Index,Index,Index,Index)
2016-09-16 11:23:19 +02:00
///
2016-02-19 22:15:01 +01:00
template < int NRows , int NCols >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline typename FixedBlockXpr < NRows , NCols > : : Type block ( Index startRow , Index startCol )
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return typename FixedBlockXpr < NRows , NCols > : : Type ( derived ( ) , startRow , startCol ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of block<>(Index, Index). */
2016-02-19 22:15:01 +01:00
template < int NRows , int NCols >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2016-02-19 22:15:01 +01:00
inline const typename ConstFixedBlockXpr < NRows , NCols > : : Type block ( Index startRow , Index startCol ) const
2010-08-25 13:09:56 +02:00
{
2016-02-19 22:15:01 +01:00
return typename ConstFixedBlockXpr < NRows , NCols > : : Type ( derived ( ) , startRow , startCol ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns an expression of a block in *this.
///
/// \tparam NRows number of rows in block as specified at compile-time
/// \tparam NCols number of columns in block as specified at compile-time
/// \param startRow the first row in the block
/// \param startCol the first column in the block
/// \param blockRows number of rows in block as specified at run-time
/// \param blockCols number of columns in block as specified at run-time
///
/// This function is mainly useful for blocks where the number of rows is specified at compile-time
/// and the number of columns is specified at run-time, or vice versa. The compile-time and run-time
/// information should not contradict. In other words, \a blockRows should equal \a NRows unless
/// \a NRows is \a Dynamic, and the same for the number of columns.
///
/// Example: \include MatrixBase_template_int_int_block_int_int_int_int.cpp
/// Output: \verbinclude MatrixBase_template_int_int_block_int_int_int_int.cpp
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
2017-01-17 11:34:28 +01:00
/// \sa block(Index,Index,NRowsType,NColsType), block(Index,Index,Index,Index), class Block
2016-09-16 11:23:19 +02:00
///
2016-02-19 22:15:01 +01:00
template < int NRows , int NCols >
inline typename FixedBlockXpr < NRows , NCols > : : Type block ( Index startRow , Index startCol ,
2013-06-18 14:29:15 +01:00
Index blockRows , Index blockCols )
{
2016-02-19 22:15:01 +01:00
return typename FixedBlockXpr < NRows , NCols > : : Type ( derived ( ) , startRow , startCol , blockRows , blockCols ) ;
2013-06-18 14:29:15 +01:00
}
2017-01-04 23:27:33 +01:00
/// This is the const version of block<>(Index, Index, Index, Index).
2016-02-19 22:15:01 +01:00
template < int NRows , int NCols >
inline const typename ConstFixedBlockXpr < NRows , NCols > : : Type block ( Index startRow , Index startCol ,
2013-06-18 14:29:15 +01:00
Index blockRows , Index blockCols ) const
{
2016-02-19 22:15:01 +01:00
return typename ConstFixedBlockXpr < NRows , NCols > : : Type ( derived ( ) , startRow , startCol , blockRows , blockCols ) ;
2013-06-18 14:29:15 +01:00
}
2017-01-17 11:34:28 +01:00
/// \returns an expression of a block in \c *this.
///
/// \tparam NRowsType the type of the object handling the number of rows in the block, can be any integral type (e.g., int, Index) or any returned by Eigen::fix<N> or Eigen::fix<N>(n).
/// \tparam NColsType analogue of NRowsType but for the number of columns.
/// \param startRow the first row in the block
/// \param startCol the first column in the block
/// \param blockRows number of rows in the block as specified at either run-time or compile-time
/// \param blockCols number of columns in the block as specified at either run-time or compile-time
///
/// \newin{3.4}
///
/// This function covers the same versatility as block<NRows,NCols>(Index, Index), and block<NRows,NCols>(Index, Index, Index, Index)
/// but with less redundancy and more consistency as it does not modify the argument order
/// and seamlessly enable hybrid fixed/dynamic sizes.
/// The one-to-one full equivalences are as follows:
///
/// \code
/// mat.template block<NRows,NCols>(i,j) <--> mat.block(i,j,fix<NRows>,fix<NCols>)
/// mat.template block<NRows,NCols>(i,j,rows,cols) <--> mat.block(i,j,fix<NRows>(rows),fix<NCols>(cols))
/// \endcode
///
/// but of course, with this version one of the compile-time parameter can be completely
/// omitted if it turns out to be a pure runtime one:
/// \code
/// mat.template block<NRows,Dynamic>(i,j,rows,cols) <--> mat.block(i,j,fix<NRows>,cols)
/// \endcode
///
EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
///
/// \sa class Block, block(Index,Index,Index,Index), fix
///
template < typename NRowsType , typename NColsType >
# ifndef EIGEN_PARSED_BY_DOXYGEN
inline typename FixedBlockXpr < internal : : get_fixed_value < NRowsType > : : value , internal : : get_fixed_value < NColsType > : : value > : : Type
# else
inline typename FixedBlockXpr < . . . , . . . > : : Type
# endif
block ( Index startRow , Index startCol , NRowsType blockRows , NColsType blockCols )
{
return typename FixedBlockXpr < internal : : get_fixed_value < NRowsType > : : value , internal : : get_fixed_value < NColsType > : : value > : : Type (
derived ( ) , startRow , startCol , internal : : get_runtime_value ( blockRows ) , internal : : get_runtime_value ( blockCols ) ) ;
}
/// This is the const version of block(Index,Index,NRowsType,NColsType)
template < typename NRowsType , typename NColsType >
# ifndef EIGEN_PARSED_BY_DOXYGEN
inline typename ConstFixedBlockXpr < internal : : get_fixed_value < NRowsType > : : value , internal : : get_fixed_value < NColsType > : : value > : : Type
# else
inline typename ConstFixedBlockXpr < . . . , . . . > : : Type
# endif
block ( Index startRow , Index startCol , NRowsType blockRows , NColsType blockCols ) const
{
return typename ConstFixedBlockXpr < internal : : get_fixed_value < NRowsType > : : value , internal : : get_fixed_value < NColsType > : : value > : : Type (
derived ( ) , startRow , startCol , internal : : get_runtime_value ( blockRows ) , internal : : get_runtime_value ( blockCols ) ) ;
}
2016-09-16 11:23:19 +02:00
/// \returns an expression of the \a i-th column of *this. Note that the numbering starts at 0.
///
/// Example: \include MatrixBase_col.cpp
/// Output: \verbinclude MatrixBase_col.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( column - major )
2017-01-04 23:27:33 +01:00
/**
* \ sa row ( ) , class Block */
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-08-25 13:09:56 +02:00
inline ColXpr col ( Index i )
{
return ColXpr ( derived ( ) , i ) ;
}
2017-01-04 23:27:33 +01:00
/// This is the const version of col().
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-12-22 17:45:37 -05:00
inline ConstColXpr col ( Index i ) const
2010-08-25 13:09:56 +02:00
{
2010-12-22 17:45:37 -05:00
return ConstColXpr ( derived ( ) , i ) ;
2010-08-25 13:09:56 +02:00
}
2016-09-16 11:23:19 +02:00
/// \returns an expression of the \a i-th row of *this. Note that the numbering starts at 0.
///
/// Example: \include MatrixBase_row.cpp
/// Output: \verbinclude MatrixBase_row.out
///
EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF ( row - major )
2017-01-04 23:27:33 +01:00
/**
* \ sa col ( ) , class Block */
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-08-25 13:09:56 +02:00
inline RowXpr row ( Index i )
{
return RowXpr ( derived ( ) , i ) ;
}
2016-09-16 11:23:19 +02:00
/// This is the const version of row(). */
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2010-12-22 17:45:37 -05:00
inline ConstRowXpr row ( Index i ) const
2010-08-25 13:09:56 +02:00
{
2010-12-22 17:45:37 -05:00
return ConstRowXpr ( derived ( ) , i ) ;
2010-08-25 13:09:56 +02:00
}
2012-11-16 19:59:11 +01:00
2016-09-16 11:23:19 +02:00
/// \returns a dynamic-size expression of a segment (i.e. a vector block) in *this.
///
/// \only_for_vectors
///
/// \param start the first coefficient in the segment
/// \param n the number of coefficients in the segment
///
/// Example: \include MatrixBase_segment_int_int.cpp
/// Output: \verbinclude MatrixBase_segment_int_int.out
///
/// \note Even though the returned expression has dynamic size, in the case
/// when it is applied to a fixed-size vector, it inherits a fixed maximal size,
/// which means that evaluating it does not cause a dynamic memory allocation.
///
/// \sa class Block, segment(Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline SegmentReturnType segment ( Index start , Index n )
2012-11-16 19:59:11 +01:00
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY ( Derived )
2013-12-21 21:46:27 +01:00
return SegmentReturnType ( derived ( ) , start , n ) ;
2012-11-16 19:59:11 +01:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of segment(Index,Index).
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline ConstSegmentReturnType segment ( Index start , Index n ) const
2012-11-16 19:59:11 +01:00
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY ( Derived )
2013-12-21 21:46:27 +01:00
return ConstSegmentReturnType ( derived ( ) , start , n ) ;
2012-11-16 19:59:11 +01:00
}
2016-09-16 11:23:19 +02:00
/// \returns a dynamic-size expression of the first coefficients of *this.
///
/// \only_for_vectors
///
/// \param n the number of coefficients in the segment
///
/// Example: \include MatrixBase_start_int.cpp
/// Output: \verbinclude MatrixBase_start_int.out
///
/// \note Even though the returned expression has dynamic size, in the case
/// when it is applied to a fixed-size vector, it inherits a fixed maximal size,
/// which means that evaluating it does not cause a dynamic memory allocation.
///
/// \sa class Block, block(Index,Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline SegmentReturnType head ( Index n )
2012-11-16 19:59:11 +01:00
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY ( Derived )
2013-12-21 21:46:27 +01:00
return SegmentReturnType ( derived ( ) , 0 , n ) ;
2012-11-16 19:59:11 +01:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of head(Index).
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline ConstSegmentReturnType head ( Index n ) const
2012-11-16 19:59:11 +01:00
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY ( Derived )
2013-12-21 21:46:27 +01:00
return ConstSegmentReturnType ( derived ( ) , 0 , n ) ;
2012-11-16 19:59:11 +01:00
}
2016-09-16 11:23:19 +02:00
/// \returns a dynamic-size expression of the last coefficients of *this.
///
/// \only_for_vectors
///
/// \param n the number of coefficients in the segment
///
/// Example: \include MatrixBase_end_int.cpp
/// Output: \verbinclude MatrixBase_end_int.out
///
/// \note Even though the returned expression has dynamic size, in the case
/// when it is applied to a fixed-size vector, it inherits a fixed maximal size,
/// which means that evaluating it does not cause a dynamic memory allocation.
///
/// \sa class Block, block(Index,Index)
///
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline SegmentReturnType tail ( Index n )
2012-11-16 19:59:11 +01:00
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY ( Derived )
2013-12-21 21:46:27 +01:00
return SegmentReturnType ( derived ( ) , this - > size ( ) - n , n ) ;
2012-11-16 19:59:11 +01:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of tail(Index).
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline ConstSegmentReturnType tail ( Index n ) const
2012-11-16 19:59:11 +01:00
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY ( Derived )
2013-12-21 21:46:27 +01:00
return ConstSegmentReturnType ( derived ( ) , this - > size ( ) - n , n ) ;
2012-11-16 19:59:11 +01:00
}
2016-09-16 11:23:19 +02:00
/// \returns a fixed-size expression of a segment (i.e. a vector block) in \c *this
///
/// \only_for_vectors
///
/// \tparam N the number of coefficients in the segment as specified at compile-time
/// \param start the index of the first element in the segment
/// \param n the number of coefficients in the segment as specified at compile-time
///
/// The compile-time and run-time information should not contradict. In other words,
/// \a n should equal \a N unless \a N is \a Dynamic.
///
/// Example: \include MatrixBase_template_int_segment.cpp
/// Output: \verbinclude MatrixBase_template_int_segment.out
///
/// \sa class Block
///
2013-12-21 21:46:27 +01:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename FixedSegmentReturnType < N > : : Type segment ( Index start , Index n = N )
2012-11-16 19:59:11 +01:00
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY ( Derived )
2013-12-21 21:46:27 +01:00
return typename FixedSegmentReturnType < N > : : Type ( derived ( ) , start , n ) ;
2012-11-16 19:59:11 +01:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of segment<int>(Index).
2013-12-21 21:46:27 +01:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename ConstFixedSegmentReturnType < N > : : Type segment ( Index start , Index n = N ) const
2012-11-16 19:59:11 +01:00
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY ( Derived )
2013-12-21 21:46:27 +01:00
return typename ConstFixedSegmentReturnType < N > : : Type ( derived ( ) , start , n ) ;
2012-11-16 19:59:11 +01:00
}
2016-09-16 11:23:19 +02:00
/// \returns a fixed-size expression of the first coefficients of *this.
///
/// \only_for_vectors
///
/// \tparam N the number of coefficients in the segment as specified at compile-time
/// \param n the number of coefficients in the segment as specified at run-time
///
/// The compile-time and run-time information should not contradict. In other words,
/// \a n should equal \a N unless \a N is \a Dynamic.
///
/// Example: \include MatrixBase_template_int_start.cpp
/// Output: \verbinclude MatrixBase_template_int_start.out
///
/// \sa class Block
///
2013-12-21 21:46:27 +01:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename FixedSegmentReturnType < N > : : Type head ( Index n = N )
2012-11-16 19:59:11 +01:00
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY ( Derived )
2013-12-21 21:46:27 +01:00
return typename FixedSegmentReturnType < N > : : Type ( derived ( ) , 0 , n ) ;
2012-11-16 19:59:11 +01:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of head<int>().
2013-12-21 21:46:27 +01:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename ConstFixedSegmentReturnType < N > : : Type head ( Index n = N ) const
2012-11-16 19:59:11 +01:00
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY ( Derived )
2013-12-21 21:46:27 +01:00
return typename ConstFixedSegmentReturnType < N > : : Type ( derived ( ) , 0 , n ) ;
2012-11-16 19:59:11 +01:00
}
2016-09-16 11:23:19 +02:00
/// \returns a fixed-size expression of the last coefficients of *this.
///
/// \only_for_vectors
///
/// \tparam N the number of coefficients in the segment as specified at compile-time
/// \param n the number of coefficients in the segment as specified at run-time
///
/// The compile-time and run-time information should not contradict. In other words,
/// \a n should equal \a N unless \a N is \a Dynamic.
///
/// Example: \include MatrixBase_template_int_end.cpp
/// Output: \verbinclude MatrixBase_template_int_end.out
///
/// \sa class Block
///
2013-12-21 21:46:27 +01:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename FixedSegmentReturnType < N > : : Type tail ( Index n = N )
2012-11-16 19:59:11 +01:00
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY ( Derived )
2013-12-21 21:46:27 +01:00
return typename FixedSegmentReturnType < N > : : Type ( derived ( ) , size ( ) - n ) ;
2012-11-16 19:59:11 +01:00
}
2016-09-16 11:23:19 +02:00
/// This is the const version of tail<int>.
2013-12-21 21:46:27 +01:00
template < int N >
2013-02-07 19:06:14 +01:00
EIGEN_DEVICE_FUNC
2013-12-21 21:46:27 +01:00
inline typename ConstFixedSegmentReturnType < N > : : Type tail ( Index n = N ) const
2012-11-16 19:59:11 +01:00
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY ( Derived )
2013-12-21 21:46:27 +01:00
return typename ConstFixedSegmentReturnType < N > : : Type ( derived ( ) , size ( ) - n ) ;
2012-11-16 19:59:11 +01:00
}