Eigen3学习笔记
密集矩阵和数组操作
矩阵类
在Eigen中,所有的矩阵和向量都是Matrix类模板的对象。
Matrix的前三个模板参数(与后面一部分内容整合在一起)
Martix一共需要6个参数,前三个必须有的模板参数如下:
Matrix<typename Scalar,
int RowsAtCompileTime,
int ColsAtCompileTime,
int Options = 0,
int MaxRowsAtCompileTime = RowsAtCompileTime,
int MaxColsAtCompileTime = ColsAtCompile
参数 | 含义 |
---|---|
Scalar | 指定矩阵内元素的数据类型 |
RowsAtCompileTime | 矩阵的行数 |
ColsAtCompileTime | 矩阵的列数 |
Option | 表明矩阵存储先存行还是列,默认是列优先,Option=RowMajor时,行优先 |
MaxRowsAtCompileTime | 动态矩阵的最大行数 |
MaxColsAtCompileTime | 动态数组的最大列数,用来解决直到矩阵上限,但具体不确定的情况 |
为了方便理解会采用typedef取别名,下面是一个示例:
typedef Matrix<float, 4, 4> Matrix4f;
向量
我们直到 向量是矩阵的一种,因此直接通过typedef来定义即可:
typedef Matrix<float, 3, 1> Vector3f; //列向量,列向量没有Col,!!!!!
typedef Matrix<int, 1, 2> RowVector2i; //行向量,行向量有Row标识
特殊值Dynamic
EIgen支持大小未知的矩阵,此时对于行和列的定义需要用到Dynamic这个特殊的值(其本身是Eigen里面的量)
typedef Matrix<double, Dynamic, Dynamic> MatrixXd; //动态矩阵
typedef Matrix<int, Dynamic, 1> VectorXi; //动态列向量
构造函数
默认构造函数始终存在,默认动态矩阵不分配大小
Matrix3f a; //分配了3x3
MatrixXf b; //未分配,0x0
通过传递行和列进行构造:
MatrixXf a(10,15); //动态大小,通过行列进行构造
VectorXf b(30); //动态列向量,通过行数进行构造
Matrix3f a(3,3); //已经指定大小的矩阵依然可以这样做,但输入的参数是无意义的。
通过传递元素进行构造:
Vector2d a(5.0, 6.0);
MatrixXi a { // construct a 2x2 matrix
{1, 2}, // first row
{3, 4} // second row
};
Matrix<double, 2, 3> b {
{2, 3, 4},
{5, 6, 7},
};
注意:用元素和行列进行构造的括号使用是不一样的
矩阵的索引
Eigen 中对矩阵的索引是通过重载括号运算符进行的。
MatrixXd m(2,2);
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = -1;
m(1,1) = m(1,0) + m(0,1);
通过逗号进行初始化
Matrix3f m;
m << 1, 2, 3, //一行一行的填写
4, 5, 6,
7, 8, 9;
获取矩阵大小和调整动态矩阵大小
MatrixXd m(2,5); //向量也可以
m.resize(4,3); //重新定义矩阵大小
m.rows(); //获取矩阵的行数
m.cols(); //获取矩阵的列数
注:固定大小矩阵的大小不能改变,但是为了语法一致性,依然可以使用resize(),只不过没有作用
复制与调整大小
MatrixXf a(2,2); //a是2x2
MatrixXf b(3,3); //b是3x3
a = b; //a是3x3
注:只有左侧是动态矩阵才允许进行这种调整
什么时候使用固定矩阵和动态矩阵呢?
- 矩阵尺寸较小(小于16个尺寸,四阶矩阵),使用固定矩阵
- 矩阵尺寸较大或必须使用动态矩阵的情况,使用动态矩阵
Eigen定义的Matrix typedefs
- Matrix<type, N, N> 的 MatrixNt
- Matrix<type, N, 1> 的 VectorNt
- Matrix<type, 1, N> 的 RowVectorNt
其中:
- N 表示:2,3,4,X(Dynamic)中的一个
- t 表示:i(int),f(float),d(double),cf(complex<float>),cd(complex<double>)