Eigen库的简单使用说明

稠密矩阵和数组操作

矩阵在使用的时候默认命名空间为Eigen

矩阵类

矩阵模板

Matrix 类采用六个模板参数,其中前三个为强制模板参数

1
Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
  • Scalar 为数据类型
  • RowsAtCompileTime 为编译时矩阵的行数
  • ColsAtCompileTime 为编译时矩阵的列数

在指定行列的大小时也可使用 Dynamic 来使矩阵定义为动态大小,如下所示

1
Eigen::Matrix<float, 3, Eigen::Dynamic> m;

也可使用 typedef 来定义特殊的矩阵

1
typedef Matrix<float, 3, 1> Vector3f;

矩阵初始化

常见的初始化方式如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 1.
Vector2d a(5.0, 6.0);
// 2.
Matrix<int, 1, 5> b = {1, 2, 3, 4, 5};
// 3.
Matrix<double, 2, 3> c {
{2, 3, 4},
{5, 6, 7},
};
// 4.
Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;

固定大小与动态大小

什么时候应该使用固定尺寸,什么时候应该选择动态尺寸?

简单的答案是:尽可能将固定大小用于非常小的尺寸,而将动态大小用于较大的尺寸。

对于小尺寸,特别是对于小于(大致)16的大小,使用固定大小对性能非常有益,因为它允许Eigen避免动态内存分配和展开循环。在内部,固定大小的特征矩阵只是一个普通的数组。

矩阵元素的访问

矩阵元素的访问可以通过 () 操作符完成,例如m(2,3)即是获取矩阵m的第2行第3列元素

矩阵的相关操作

Eigen对+-*/操作符均进行了重载,直接使用即可。

其他相关操作(参考)有:

函数名 作用
dot() 点积
cross() 叉积
transpose() 转置
inverse() 逆矩阵
conjugate() 共轭矩阵
adjoint() 伴随矩阵
trace() 矩阵的迹
eigenvalues() 矩阵的特征值
determinant() 矩阵求行列式的值
diagonal() 矩阵对角线元素
sum() 矩阵所有元素求和
prod() 矩阵所有元素求积
mean() 矩阵所有元素求平均
maxCoeff() 矩阵的最大值
minCoeff() 矩阵的最小值
mean() 矩阵的平均值
Matrix::Identity() 单位矩阵