Eigen是基于线性代数的C ++模板库,主要用于矩阵,向量,数值求解器和相关算法。Ceres,G2O等项目均是基于Eigen。
1.支持整数、浮点数、复数,使用模板编程,可以为特殊的数据结构提供矩阵操作。
2.支持逐元素、分块、和整体的矩阵操作。
3.支持使用Intel MKL加速部分功能。
4.支持多线程稀疏矩阵支持良好,
5.支持常用几何运算,包括旋转矩阵、四元数、矩阵变换、角轴等等。OpenCV自带到Eigen的接口。
Eigen是基于线性代数的C ++模板库,主要用于矩阵,向量,数值求解器和相关算法。Ceres,G2O等项目均是基于Eigen。
1.支持整数、浮点数、复数,使用模板编程,可以为特殊的数据结构提供矩阵操作。
2.支持逐元素、分块、和整体的矩阵操作。
3.支持使用Intel MKL加速部分功能。
4.支持多线程稀疏矩阵支持良好,
5.支持常用几何运算,包括旋转矩阵、四元数、矩阵变换、角轴等等。OpenCV自带到Eigen的接口。
一、Matrix类
Matrix类采用六个模板参数,但现在了解前三个参数就足够了。
- Matrix<float,2,3> matrix23; //表示生成一个float类型的2*3的矩阵
- matrix23<<1,2,3,1,2,3;//对矩阵进行初始化
- //如果需要生成向量
- Matrix<float,3,1> Vector3; //表示生成3行一列的向量
- /*如果需要生成固定大小的矩阵*/
- Matrix3f a;
- MatrixXf b;
- /*a是一个 3*3 动态大小的矩阵,具有已分配但当前未初始化的系数。
- b是大小为 0)0 的动态大小矩阵,具有已分配但当前未初始化的系数。*/
- //对于以及确定长度的Matrix3f 可以通过构造函数赋值
- Matrix2d c(1,2,2,1);
如果不确定需要多大的矩阵或者是向量,可以用Dynamic动态申请大小:
- Matrix<float,Dynamic,Dynamic> matrix; //表示生成一个float类型的n*n的矩阵
- //如果需要生成向量
- Matrix<float,Dynamic,1> Vectorn; //表示生成n行一列的向量
- //如果不确定矩阵大小可以通过构造函数进行初始化
- MatrixXf matrx(10,29);//float类型的10*29的矩阵
- VectorXf vector(30);//float类型的30长度的向量
C++11,则可以通过传递任意数量的系数来初始化任意大小的固定大小的列或行向量
- Matrix<int,3,1> vector3;
- vector3<<1,2,3;
获取矩阵的大小和矩阵的行列数:
- cout<<"this matrix row"<<vector3.rows()<<"this matrix cols "<<vector3.cols()<<
- "this matrix size "<<vector3.size()<<endl;
当使用位置大小的Matrix时可以给另一个Matrix进行赋值,而且会改变另一个矩阵的大小。
- MatrixXi matrix22(2,2);
- MatrixXi matrix33(3,3);
- matrix22=matrix33;
- cout<<"matrix22:"<<matrix22.rows()<<" x"<<matrix22.cols()<<endl;
Matrix的模板其实有6个参数:
- Matrix<typename Scalar,
- int RowsAtCompileTime,
- int ColsAtCompileTime,
- int Options = 0,
- int MaxRowsAtCompileTime = RowsAtCompileTime,
- int MaxColsAtCompileTime = ColsAtCompileTime>
Options
是一个位字段。在这里,我们只讨论一点:RowMajor
. 它指定这种类型的矩阵使用行优先存储顺序;默认情况下,存储顺序为列优先。
MaxRowsAtCompileTime
并且MaxColsAtCompileTime
当您想要指定时很有用,即使在编译时不知道矩阵的确切大小,但在编译时知道固定的上限。您可能想要这样做的最大原因是避免动态内存分配。
二、矩阵运算
数字加减乘除很简单只需要用+ - * /即可,eigen以及将运算符进行了重载。
mat.transpose():转置矩阵。
mat.inverse():逆矩阵
mat.conjugate():共轭矩阵
mat.adjoint():伴随矩阵
mat.trace():矩阵的迹
mat.eigenvalues():矩阵的特征值
mat.determinant():矩阵求行列式的值
mat.diagonal():矩阵对角线元素
mat.sum():矩阵所有元素求和
mat.prod():矩阵所有元素求积
mat.mean():矩阵所有元素求平均
mat.maxCoeff() :矩阵的最大值
mat.minCoeff(): 矩阵的最小值
mat.mean():矩阵的平均值
Matrix::Identity():单位矩阵
点积和叉积:
dot()和cross()
三、基本的线性求解
求解方程的解有很多的方法,最普遍的方法有求逆。eigen中还提供QR分解和SVD等方法求解,除 函数不同大致的语句都相同。
以下为演示代码:
- //矩阵的运算
- Matrix3d matrix3_3=Matrix3d::Random();
- matrix3_3=matrix3_3*matrix3_3.transpose();//保持半正定性
- Vector3d vector3_1=Vector3d::Random();
-
- //矩阵直接求逆运算
- clock_t time_stt=clock();
- Vector3d Solve3=matrix3_3.inverse() * vector3_1;
- cout<<"the solver is \n"<<Solve3<<" use time is \n"
- <<1000*(clock()-time_stt)/(double)CLOCKS_PER_SEC<<"ms"
- <<endl;
- //使用qr分解求解
- time_stt=clock();
- Solve3=matrix3_3.colPivHouseholderQr().solve(vector3_1);
- cout<<"the solver is \n"<<Solve3<<" use time is \n"
- <<1000*(clock()-time_stt)/(double)CLOCKS_PER_SEC<<"ms"
- <<endl;
-
- //使用cholesky求解
- time_stt=clock();
- Solve3=matrix3_3.ldlt().solve(vector3_1);
- cout<<"the solver is \n"<<Solve3<<" use time is \n"
- <<1000*(clock()-time_stt)/(double)CLOCKS_PER_SEC<<"ms"
- <<endl;
有兴趣的同学可以继续了解eigen的使用,主要为一些实践操作并且实时进行更新:
Eigen库的基本使用说明(二)_每日亿学的博客-CSDN博客本文章主要介绍了Eigen库的基本的使用说明,延续之前文章并且更加注重例子和实用性。https://blog.csdn.net/HHB791829200/article/details/128947059?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22128947059%22%2C%22source%22%3A%22HHB791829200%22%7D