在Eigen中,所有的矩阵和向量都是Matrix
模板类的对象,向量只是一种特殊的矩阵。
Matrix的三个模板参数
Matrix
类接受6个模板参数,要说的这三个参数是强制性的,其他三个有默认值。
Matrix<typename Scalar, int RowsAtCompileTile, int ColsAtCompileTime>
参数含义:
- Scalar
是可选标量类型,如想要float类型的矩阵,则选择相应的表示float
类型的值;
- RowAtCompileType
和ColsAtCompileType
是矩阵在编译时就已经确定的行数和列数,这类似于C的数组;
Eigen 已经有很多内置的Matrix类型,例如Matrix4f
表示的是4x4的float
类型的矩阵,可直接使用。
Vector3f
表示3x1的float
类型的列向量,RowVector2i
表示1x2的int
类型的行向量。
VectorNt
和MatrixNt
分别表示向量和矩阵,其中N可以取值为2、3、4、N;t可以取值为i
、f
、d
、cf
表示复数浮点数、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
是一个位域,确定矩阵是按行存储,还是列存储,默认是列存储。
MaxRowsAtCompileTime
和MaxColsAtCompileTime
是矩阵维度在编译时未知,但是可以知道上限,有时可以避免动态内存申请。例如,Matrix<float, Dynamic, Dynamic, 0, 3, 4>
,总数位12,不会动态申请。