【1】EIGEN-Matrix类

在Eigen中,所有的矩阵和向量都是Matrix模板类的对象,向量只是一种特殊的矩阵。

Matrix的三个模板参数

Matrix类接受6个模板参数,要说的这三个参数是强制性的,其他三个有默认值。
Matrix<typename Scalar, int RowsAtCompileTile, int ColsAtCompileTime>
参数含义:
- Scalar是可选标量类型,如想要float类型的矩阵,则选择相应的表示float类型的值;
- RowAtCompileTypeColsAtCompileType是矩阵在编译时就已经确定的行数和列数,这类似于C的数组;

Eigen 已经有很多内置的Matrix类型,例如Matrix4f表示的是4x4的float类型的矩阵,可直接使用。
Vector3f表示3x1的float类型的列向量,RowVector2i表示1x2的int类型的行向量。
VectorNtMatrixNt分别表示向量和矩阵,其中N可以取值为2、3、4、N;t可以取值为ifdcf表示复数浮点数、cd表示复数double数,其他类型请查看手册。

Matrix的动态维度

通过Dynamic关键词设置Matrix维度为运行时确定,例如MatrixXd定义为typedef Matrix<double, Dynamic, Dynamic> MatrixXd;

构造函数

Eigen的矩阵有默认构造函数,该函数不会进行任何动态内存申请,也不会初始化任何矩阵元素。例如,

Matrix3f a;
MatrixXf b;

a是一个3x3矩阵,实际上是float[9]的未初始化数组;而b是一个0x0的浮点类型的动态矩阵,其数组元素值还未申请。

也有能对矩阵尺寸赋值的构造函数,例如,

MatrixXf a(10,15);
VectorXf b(30);

对于矩阵,总是行数、再列数,a是一个10x15的浮点类型矩阵,空间已经申请但是未初始化;b是一个大小未30的可变向量,空间已经申请但是未初始化。

Eigen对4以下的向量提供了初始化元素的构造函数,例如,

Vector2d a(5.0, 6.0);
Vector3d b(5.0, 6.0, 7.0);
Vector4d c(5.0, 6.0, 7.0, 8.0);

矩阵索引

所有Eigen矩阵默认都是以列形式存储,但是可转换为行存储。m(index)并不一定表示向量,这与矩阵的存储形式有关系。运算符[]在向量中被重载,但是c++不允许接受一个以上的参数,以m[i,j]形式访问m元素,会错误。

使用逗号表达式进行初始化

Matrix3f m;
m << 1, 2, 3,
     4, 5, 6,
     7, 8, 9;

Resizing调整维度

可以通过rows()/cols()/size()获得矩阵当前的行数、列数和总元素数,使用resize()函数必须保证调整后的size和原来的是一致的,否则会造成元素值出现不可预期状况;不可对固定维度的矩阵进行维度变换,会造成断言失败。

赋值时,将左侧可变维度矩阵先resize,然后再将元素值拷贝,如果左侧是固定维度类型的矩阵赋值,是不允许赋不同维度类型的矩阵的。

固定维度的矩阵定义实际上存储形式维array,在效率与执行速度、存储等方面具有优势。而动态矩阵总是在堆上进行空间申请。

可选参数值

Matrix<typename Scalar,
       int RowsAtCompileTime,
       int ColsAtCompileTime,
       int Options = 0,
       int MaxRowsAtCompileTime = RowsAtCompileTime,
       int MaxColsAtCompileTime = ColsAtCompileTime>

Options是一个位域,确定矩阵是按行存储,还是列存储,默认是列存储。
MaxRowsAtCompileTimeMaxColsAtCompileTime是矩阵维度在编译时未知,但是可以知道上限,有时可以避免动态内存申请。例如,Matrix<float, Dynamic, Dynamic, 0, 3, 4>,总数位12,不会动态申请。

原文地址:https://www.cnblogs.com/imagezy/p/7845209.html