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 matrix23; //表示生成一个float类型的2*3的矩阵
matrix23<<1,2,3,1,2,3;//对矩阵进行初始化
//如果需要生成向量
Matrix Vector3;  //表示生成3行一列的向量
/*如果需要生成固定大小的矩阵*/
Matrix3f a;
MatrixXf b;
/*a是一个 3*3 动态大小的矩阵,具有已分配但当前未初始化的系数。
b是大小为 0)0 的动态大小矩阵,具有已分配但当前未初始化的系数。*/
//对于以及确定长度的Matrix3f 可以通过构造函数赋值
Matrix2d c(1,2,2,1);

如果不确定需要多大的矩阵或者是向量,可以用Dynamic动态申请大小:

Matrix matrix; //表示生成一个float类型的n*n的矩阵
//如果需要生成向量
Matrix Vectorn;  //表示生成n行一列的向量
//如果不确定矩阵大小可以通过构造函数进行初始化
MatrixXf matrx(10,29);//float类型的10*29的矩阵
VectorXf vector(30);//float类型的30长度的向量

 C++11,则可以通过传递任意数量的系数来初始化任意大小的固定大小的列或行向量 

 Matrix  vector3;
 vector3<<1,2,3;

获取矩阵的大小和矩阵的行列数:

cout<<"this matrix row"<

当使用位置大小的Matrix时可以给另一个Matrix进行赋值,而且会改变另一个矩阵的大小。

MatrixXi matrix22(2,2);
MatrixXi matrix33(3,3);
matrix22=matrix33;
cout<<"matrix22:"<

Matrix的模板其实有6个参数:

Matrix

 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等方法求解,除 函数不同大致的语句都相同。

Eigen库的基本使用说明_第1张图片

 以下为演示代码:

//矩阵的运算
    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"<

你可能感兴趣的:(eigen3,矩阵,线性代数,算法)