Eigen 库入门教程

 Eigen库对于很多需要做SLAM、图像、自动驾驶等方向的人肯定不陌生非常值得学习,本文将整理一些Eigen库的使用教程供初学者能够快速熟悉并入门。

首先,有能力的同学请阅读官方文档,这里是最全的教程资料查找地点:

Eigenhttps://eigen.tuxfamily.org/index.php?title=Main_Page本文主要内容也来自于官网。

Eigen库最显著的特点是,使用时只需要包含头文件即可(它是纯用头文件搭建起来的库),不需要链接库。从而在使用诸如cmake等工具时,只需要添加   find_package(Eigen3 REQUIRED)  即可,无需link。或者通过include_directories(\eigen-3.4.0)添加包含即可(常在PC中使用)。

这里忽略一下安装流程(非常简单),但请注意工程所依赖的Eigen版本。

首先举一个简短的例子:

#include <iostream>
#include <eigen3/Eigen/Dense>   //Dense是最常用的

using namespace std;
using namespace Eigen;

int main()
{
    MatrixXd m(2,2);
    MatrixXd n(2,2);//MatrixXd  代表X维度(Dynamic)的矩阵
    m(0,0) = 3;
    m(1,0) = 2.5;
    m(0,1) = -1;
    m(1,1) = m(1,0) + m(0,1);
    n<<1, 1,
            1,1;     //通过操作符重载赋值
    cout << m <<endl;
    cout << n <<endl;
}


//输出为
// 3  -1
//2.5 1.5
//1 1
//1 1

 说明我们的Eigen已经用起来了。那么上面写的  Dense是最常用的,我们包含的时候如何选择呢?

 解释如上,所以为什么常常使用Dense呢?因为一个Dense就包含了Core, Geometry, LU, Cholesky, SVD, QR, 以及 Eigenvalues 的头文件。

好,我们继续,Eigen提供了两种dense object  矩阵matrix以及向量vector都用由模板类Matrix表征,对于一维和二维的数组,则由模板Array数组表征,语法如下:

typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyMatrixType;
typedef Array<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyArrayType;

 其中Scalar代表常数的类型,例如floatdoubleboolint等等。

RowsAtCompileTime 以及ColsAtCompileTime  代表行列数,或者使用Dynamic,动态

OPtions 可以选择ColMajor or RowMajor  默认是col列排列(也就是行排列还是列排列,互为转置)

合法的写法可以是:

Matrix<double, 6, Dynamic>  m1                // 列是动态的,调用堆
Matrix<double, Dynamic, 2>  m2                // 行是动态的,调用堆
Matrix<double, Dynamic, Dynamic, RowMajor> m3 // 全动态,调用堆
Matrix<double, 13, 3>  m4                     // 全是确定的(通常保存在栈上)

 通常,使用的时候我们不需要这么麻烦,库本身已经提供了许多的typedefs :

 我们都知道对于矩阵来说,维度和运算是尤为重要的,那么矩阵和数组都有哪些转换呢?

Array44f a1, a1;                  //定义两个数组(二维)和两个矩阵
Matrix4f m1, m2;
m1 = a1 * a2;                     // 共轭乘积,这样两个向量之积为矩阵(4*4)
a1 = m1 * m2;                     // 两个矩阵相乘,将矩阵转换为向量
a2 = a1 + m1.array();             // 矩阵和向量是不能直接运算的,使用.array()转换
m2 = a1.matrix() + m1;            // 或者.Matrix()的显示转换
ArrayWrapper<Matrix4f> m1a(m1);   // m1a是m1的指代

值得注意的是不同类型的数据类型不能直接计算,需要cast转换  例如 m1.cast<double>() 。  

矩阵基本的操作:

 其中需要注意的是  MatrixXf::Zero(m, n) 以及  MatrixXf::Identity(m, n),分别代表全0矩阵和对角线为1的矩阵。

暂且写到这块吧,后续随缘更新~

推荐阅读:(博主总结得很全!)

Eigen线性代数库学习大全_几度春风里的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/m0_46611008/article/details/128006586