Eigen库是一个C++的开源线性代数库。它是一个纯头文件搭建起来的库,不需要链接库文件。
Eigen库中所有的向量和矩阵都是Eigen::Matrix,它是一个模板类,它的前三个参数为数据类型、行、列。
如果不确定矩阵的大小,可以使用动态大小的矩阵:Matrix<double,Dynamic,Dynamic> matrix_dynamic;
随机数矩阵:Matrix3d::Random();
转置:matrix_33.transpose();
各元素之和:matrix_33.sum();
迹:matrix_33.trace();
逆:matrix_33.inverse();
行列式:matrix_33.determinant();
对角化:eigen_solver.eigenvalues();
QR分解:matrix_NN.colPivHouseholderQr().solve(v_Nd);
cholesky分解:matrix_NN.ldlt().solve(v_Nd);
setIdentity(); //定义为单位矩阵
注意:
(1)以下代码是错误的:
矩阵的逆运算不能赋值给本身。因为矩阵的逆运算中,第二行和第三行的计算会用到第一行的值。如果第一行已经改变则会导致计算的结果出现错误。
Eigen::Matrix3d aa;
aa<<1,2,3,4,5,6,7,8,9;
aa = aa.inverse(); //错误,矩阵的逆运算不能赋值给本身。因为矩阵的逆运算中,第二行和第三行的计算会用到前面行的值。如果第一行已经改变则导致计算的结果出现错误。
(2)Eigen库中的矩阵是按照列进行排序的,这个opencv中的Mat不一样,Mat是按照行排序的。所以两者之间的转换可以直接求转置矩阵。
(3)使用eigen出现以下的错误:
ERROR:YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD.
其实是类型没有写对,修改类型即可,比如像这样子,引用:https://blog.youkuaiyun.com/HelloJinYe/article/details/106459904
Eigen::MatrixXd d; // Matrix of doubles.
Eigen::MatrixXf f = d.cast <float> (); // Matrix of floats.
(4)旋转矩阵的逆和转置相同,对于4*4的四元数,可以这样赋值:
Eigen::Matrix4d pose;
Eigen::Matrix3d MatrixR;
Eigen::Vector3d MartixT;
pose.setIdentity(); //先初始化为单位矩阵
pos.topLeftCorner(3,3) = MatrixR; //设置左上边的3*3矩阵为旋转矩阵
pose.topRightCorner(3,1) = MartixT; //设置右上边的三行一列为平移矩阵
(5)矩阵的角相关操作:
左上角p*q:matrix.topLeftCorner(p,q);
matrix.topLeftCorner< p,q >();
左下角p*q:matrix.bottomLeftCorner(p,q);
matrix.bottomLeftCorner< p,q >();
右上角p*q:matrix.topRightCorner(p,q);
matrix.topRightCorner< p,q >();
右下角p*q:matrix.bottomRightCorner(p,q);
matrix.bottomRightCorner< p,q >();
前q行:matrix.topRows(q);
matrix.topRows< q >();
后q行:matrix.bottomRows(q);
matrix.bottomRows< q >();
左p列:matrix.leftCols(index n);
matrix.leftCols< p >();
右p列:matrix.rightCols(index n);
matrix.rightCols< p >();
(6)块操作的定义
在Eigen库中,可以使用函数 .block() 来提取矩阵中的某一个区域, .block() 有两种形式,两种形式的功能是等价的。在Eigen库中,索引是从0开始的。
定义一个从元素(i, j)为起点,大小为(p, q)的块:
使用动态尺寸的block进行构建: .block(i, j, p, q)
使用固定尺寸的block进行构建: .block< p,q >(i, j)
(7)范数计算:
#include <Eigen/Dense>
#include <iostream>
int main()
{
Eigen::MatrixXf m(2,2);
m << 1,-2,
-3,4;
//将矩阵m每个元素取绝对值后,对每列求和,并取最大值。
std::cout << "1-norm(m) = " << m.cwiseAbs().colwise().sum().maxCoeff()
//对每列求1范数,并取最大值。
<< " == " << m.colwise().lpNorm<1>().maxCoeff() << std::endl;
//将矩阵m每个元素取绝对值后,对每行求和,并取最大值。
std::cout << "infty-norm(m) = " << m.cwiseAbs().rowwise().sum().maxCoeff()
//对每行求1范数,并取最大值。
<< " == " << m.rowwise().lpNorm<1>().maxCoeff() << std::endl;
}