Eigen库的基本使用说明

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

  • 24
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Eigen 是一个 C++ 模板,用于线性代数和数值计算。它提供了高性能的矩阵和向量操作,以及许多常用的数学函数和算法。下面是 Eigen 基本使用说明: 1. 安装:你可以从 Eigen 的官方网站(https://eigen.tuxfamily.org/)下载最新版本的源代码,并将其包含在你的项目中。 2. 包含头文件:在你的 C++ 代码中,使用 `#include <Eigen/Dense>` 来包含 Eigen 的主要头文件。 3. 定义矩阵和向量:Eigen 提供了 `Matrix` 和 `Vector` 类模板来定义矩阵和向量。你可以使用不同的数据类型(例如 float、double)和大小来实例化这些类。 ```cpp #include <Eigen/Dense> int main() { // 定义一个 3x3 的矩阵 Eigen::Matrix3d matrix; // 定义一个 3 维向量 Eigen::Vector3d vector; // ... return 0; } ``` 4. 矩阵和向量操作:Eigen 提供了丰富的运算符和函数,用于执行矩阵和向量的各种操作,如矩阵乘法、转置、逆等。 ```cpp #include <Eigen/Dense> #include <iostream> int main() { Eigen::Matrix2d A; Eigen::Vector2d b; // 矩阵赋值 A << 1, 2, 3, 4; // 向量赋值 b << 5, 6; // 矩阵乘法 Eigen::Vector2d result = A * b; // 输出结果 std::cout << result << std::endl; return 0; } ``` 5. 其他功能:Eigen 还提供了许多其他功能,如特征值分解、奇异值分解、QR 分解等。你可以通过查阅 Eigen 的官方文档来了解更多详细的使用方法和示例代码。 以上是 Eigen 基本使用说明,希望对你有所帮助!如有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每日亿学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值