视觉SLAM十四讲(二)Eigen库

2 篇文章 1 订阅

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.csdn.net/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;
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值