0
点赞
收藏
分享

微信扫一扫

Eigen库的基本使用说明

月半小夜曲_ 2022-03-13 阅读 55

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以及将运算符进行了重载。

 点积和叉积:

dot()和cross()

举报

相关推荐

0 条评论