参考文章:
https://blog.csdn.net/houjixin/article/details/8490941
Eigen矩阵运算开源库完全使用指南 - 程序员大本营 (pianshen.com)
帮助文档:https://pan.baidu.com/s/104CuzGo9KtW5Rtlvp5EuSg sysu
1. 前言
本篇文档主要目的为记录个人使用Eigen时遇到的一些问题以及使用心得等等,其实更多的是留给自己日后方便重新查看吧。目前遇到的最奇怪的问题就是动态矩阵相加报错的bug,如若遇到新的问题会再继续更新。
2. Eigen
Eigen库是一个开源的矩阵运算库,以矩阵为其基本数据类型,向量也是其中一种的特殊矩阵,所有矩阵数据类型都是由一个模板类Matrix生成的,其定义方式为:
Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols >
常用:
_Scalar:数值类型,支持用户自定义的数值类型。
_Rows:行数,或者 Dynamic,即动态输入。
_Cols:列数,或者 Dynamic,即动态输入。
不常用:
_Options:定义各类选项,包括行优先、列优先等。
_MaxRows:最大行数量。
_MaxCols:最大列数量。
3. 动态矩阵与静态矩阵
静态矩阵是指其大小在编译时确定,有以下几种定义方式:
Matrix3d a:表示元素类型为double,大小为3*3,其大小在编译时就知道。
Matrix b:其行列数不能以变量的形式输入。
动态矩阵是指其大小在运行时确定,有以下几种定义方式:
MatrixXd c(5, 2):虽然指定了矩阵的大小,但也是在运行时才确定,属动态矩阵。
Matrix d:赋值前需要先用resize()或者Random()函数进行初始化以确定其行列范围。
需注意:
- 固定大小的矩阵不能使用resize()来修改矩阵的大小。
- resize()函数会析构掉原来的数据,因此调用resize()函数之后将不能保证元素的值不改变。
- 使用”=”操作符操作动态矩阵时,如果左右两边的矩阵大小不等,则左边的动态矩阵的大小会被修改为右边的大小。
- Eigen重载了“<<”操作符,可用于对已初始化的矩阵进行赋值,赋值时会以行优先的顺序依次进行赋值,也可以使用矩阵或向量进行分块赋值,不过分块的大小不能超出矩阵的范围。
- 对于动态矩阵m,n与静态矩阵q,m + n会报错,m + q不会报错,m + n + q会报错,m + q + n, q + m + n不会报错。使用VectorXd定义的动态向量之间的加减运算不会报错。
- 对于动态矩阵m与静态矩阵q,2 * m不会报错,m * 2会报错,(m + q) * 2不会报错。
猜测:虽然动态矩阵已经是固定大小,但Eigen进行运算时对其行列的引用出错。
报错内容: 读取访问权限冲突。
4. 函数
基本还是很全面的,有需要的时候浏览帮助文档即可
- 对矩阵元素进行操作或计算的函数:cwisexxx系列。
- 各类基础矩阵计算函数等。
- 矩阵类型判断函数等。