1、基础
Eigen中所有向量和矩阵都是Eigen::Matrix,它是一个模板类。它的前三个参数为数据类型、行、列,如声明一个2x3的float矩阵:
Matrix<float,2,3> M_23;
1.1 矩阵
矩阵声明
Eigen::Matrix<type,n,m> M_nm;//如果不记得分类的模板,直接用这个总的模板
Eigen::Matrix3d M_33;//3x3矩阵,元素类型为double
Eigen::Matrix2d M_22;//2x2矩阵
Eigen::MatrixXd M_nm(n,m);//nxm矩阵
Eigen::MatrixXd M;//不确定矩阵大小,可使用动态大小的矩阵
矩阵元素操作
M.setZero();//矩阵元素全部置为0
Eigen::Matrix3d M = Eigen::Matrix3d::Random();//随机数矩阵
1.2 向量
typedef Eigen::Matrix<double,3,1> Vector3d;//向量的底层其实还是矩阵
Eigen::Vector3d v3;
Eigen::Vector2d v2;
Eigen::VectorXd v;
2、矩阵操作
2.1、元素访问
矩阵“<<”操作是先填完一行再到下一行;
矩阵(0),矩阵(1)是先取完一列再到下一列;为了保险起见,如果是矩阵,最好用下标(n,m)来进行相应元素的操作。
向量采用(0),(1)来表示元素。
向量可使用"()“和”[]“进行元素访问;矩阵只能用”()"进行元素访问
2.2 块操作
M.block<i,j>(a,b);//从第a行,第b列开始,提取大小为i行j列的块
M.block(a,b,i,j);//从第a行,第b列开始,提取大小为i行j列的块
2.3
M.inverse();//逆
M.transpose();//转置
M.rows();
M.cols();
M.size();
M.resize();//动态矩阵才可以通过resize来改变大小
3、Eigen进行最小二乘求解
一个超定方程组,例如Ax=b
没有解。
超定方程组指方程个数大于未知量个数的方程组,例如,如果给定的三点不在一条直线上, 将无法得到这样一条直线同时经过给定这三个点。 也就是说给定的条件(限制)过于严格, 导致解不存在。只能求一个近似解,方法是最小二乘法。最小二乘的意思是,最小化的误差欧式距离平方。
Ax=b
中,x是要求的解。
此处使用的三种求解方法为:
- SVD分解→通常准确率最高,但是速度最慢
- QR分解→位于两者之间
- 正规矩阵(normal equation)→速度最快,但是准确率最低
H.colPivHouseholderQr().solve(b);//QR分解
H.ldlt().solve(b);//cholesky分解
3.1QR分解
Eigen中QR分解类有三个:
- HouseholderQR(没有枢转,快速但不稳定)
- ColPivHouseholderQR(列枢转,因此有一些慢但是更准确)最常用
- FullPivHouseholderQR(完全旋转,最慢,但是最稳定)
3.2 正规矩阵
求解 A x = b Ax=b Ax=b的最小二乘解等于求解正规矩阵 A T A x = A T b A^TAx=A^Tb ATAx=ATb.