Eigen::Block
шаблон<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
класс Eigen::Block< XprType, BlockRows, BlockCols, InnerPanel >
Выражение фиксированного или динамического блока.
- Параметры шаблона
-
XprType тип выражения, из которого извлекается блок BlockRows количество строк блока (на этапе компиляции, необязательно) BlockCols количество столбцов блока (на этапе компиляции, необязательно) InnerPanel равно true, если блок соответствует набору строк матрицы с порядком следования строк или набору столбцов матрицы с порядком следования столбцов (необязательно). Параметр позволяет определить на этапе компиляции, возможен ли выровненный доступ к блоку выражения.
Этот класс представляет выражение фиксированного или динамического блока. Он является возвращаемым типом DenseBase::block(Index,Index,Index,Index) и DenseBase::block<int,int>(Index,Index), и в большинстве случаев используется только таким образом.
Однако, если вы хотите напрямую манипулировать выражениями блоков, например, если хотите написать функцию, возвращающую такое выражение, вам необходимо использовать этот класс.
Вот пример динамического случая:
#include <Eigen/Core> #include <iostream> using namespace Eigen; using namespace std; template<typename Derived> Eigen::Block<Derived> topLeftCorner(MatrixBase<Derived>& m, int rows, int cols) { return Eigen::Block<Derived>(m.derived(), 0, 0, rows, cols); } template<typename Derived> const Eigen::Block<const Derived> topLeftCorner(const MatrixBase<Derived>& m, int rows, int cols) { return Eigen::Block<const Derived>(m.derived(), 0, 0, rows, cols); } int main(int, char**) { Matrix4d m = Matrix4d::Identity(); cout << topLeftCorner(4*m, 2, 3) << endl; // calls the const version topLeftCorner(m, 2, 3) *= 5; // calls the non-const version cout << "Now the matrix m is:" << endl << m << endl; return 0; }
Результат:
4 0 0 0 4 0 Now the matrix m is: 5 0 0 0 0 5 0 0 0 0 1 0 0 0 0 1
- Примечание
- Несмотря на то, что это выражение имеет динамический размер, в случае, когда XprType имеет фиксированный размер, это выражение наследует фиксированный максимальный размер, что означает, что его вычисление не вызывает динамическое выделение памяти.
Вот пример фиксированного случая:
#include <Eigen/Core> #include <iostream> using namespace Eigen; using namespace std; template<typename Derived> Eigen::Block<Derived, 2, 2> topLeft2x2Corner(MatrixBase<Derived>& m) { return Eigen::Block<Derived, 2, 2>(m.derived(), 0, 0); } template<typename Derived> const Eigen::Block<const Derived, 2, 2> topLeft2x2Corner(const MatrixBase<Derived>& m) { return Eigen::Block<const Derived, 2, 2>(m.derived(), 0, 0); } int main(int, char**) { Matrix3d m = Matrix3d::Identity(); cout << topLeft2x2Corner(4*m) << endl; // calls the const version topLeft2x2Corner(m) *= 2; // calls the non-const version cout << "Now the matrix m is:" << endl << m << endl; return 0; }
Результат:
4 0 0 4 Now the matrix m is: 2 0 0 0 2 0 0 0 1
- См. также
- DenseBase::block(Index,Index,Index,Index), DenseBase::block(Index,Index), класс VectorBlock
Наследует Eigen::BlockImpl< XprType, BlockRows, BlockCols, InnerPanel, internal::traits< XprType >::StorageKind >.
| Block (XprType &xpr, Index i) | |
| Block (XprType &xpr, Index startRow, Index startCol) | |
| Block (XprType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols) | |
Block() [1/3]
| inline |
Конструктор для столбца или строки
Block() [2/3]
| inline |
Конструктор для фиксированного размера
Block() [3/3]
| inline |
Конструктор для динамического размера
Документация для этого класса была сгенерирована из следующего файла:
© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/classEigen_1_1Block.html