视觉SLAM⼗四讲(⼆)Eigen库
Eigen库是⼀个C++的开源线性代数库。它是⼀个纯头⽂件搭建起来的库,不需要链接库⽂件。
Eigen库中所有的向量和矩阵都是Eigen::Matrix,它是⼀个模板类,它的前三个参数为数据类型、⾏、列。
如果不确定矩阵的⼤⼩,可以使⽤动态⼤⼩的矩阵:Matrix<double,Dynamic,Dynamic> matrix_dynamic;
随机数矩阵:Matrix3d::Random();
转置:anspose();
各元素之和:matrix_33.sum();
迹:ace();
逆:matrix_33.inverse();
⾏列式:matrix_33.determinant();
对⾓化:eigen_solver.eigenvalues();
QR分解:lPivHouseholderQr().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.
identity matrix是什么意思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(); //先初始化为单位矩阵
(5)矩阵的⾓相关操作:
左上⾓p*q:pLeftCorner(p,q);
左下⾓p*q:matrix.bottomLeftCorner(p,q);
matrix.bottomLeftCorner< p,q >();
右上⾓p*q:pRightCorner(p,q);
右下⾓p*q:matrix.bottomRightCorner(p,q);
matrix.bottomRightCorner< p,q >();
前q⾏:pRows(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开始的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论