乐趣区

关于c++:Eigen初见

Eigen 是基于 C ++ 模板的矩阵运算库,在 SLAM 中是必须把握的。Eigen 有一个特地的中央就是它是一个齐全用头文件搭建的库,不须要链接库文件
Eigen 中矩阵的定义

在 CMakeLists.txt 中指定 Eigen 的头文件目录

include_directories("usr/include/eigen3")
//Eigen 外围局部
#include <Eigen/Core>
// 用于浓密矩阵的代数运算
#include <Eigen/Dense>

Matrix<double, 3, 3> A;               
Matrix<double, 3, Dynamic> B;         
Matrix<double, Dynamic, Dynamic> C;   // 反对动静大小的矩阵
Matrix3f P, Q, R;                     // 3x3 float matrix.
Vector3f x, y, z;                     // 3x1 float matrix.
RowVector3f a, b, c;                  // 1x3 float matrix.
VectorXd v;                           // Dynamic column vector of doubles

矩阵类型转换。
Eigen 矩阵不反对主动类型晋升,必须显式地对矩阵类型进行转换。

//// Type conversion
// Eigen                           // Matlab
A.cast<double>();                  // double(A)
A.cast<float>();                   // single(A)
A.cast<int>();                     // int32(A)
A.real();                          // real(A)
A.imag();                          // imag(A)
// if the original type equals destination type, no work is done

Eigen 求解线性方程组 Ax = b,个别不会间接求逆,而是采纳矩阵合成,速度会快很多

x = A.ldlt().solve(b));  // A sym. p.s.d.    #include <Eigen/Cholesky>
x = A.llt().solve(b));  // A sym. p.d.      #include <Eigen/Cholesky>
x = A.lu().solve(b));  // Stable and fast. #include <Eigen/LU>
x = A.qr().solve(b));  // No pivoting.     #include <Eigen/QR>
x = A.svd().solve(b));  // Stable, slowest. #include <Eigen/SVD>

Eigen 求矩阵特征值

A.eigenvalues();                  // eig(A);
EigenSolver<Matrix3d> eig(A);     // [vec val] = eig(A)
eig.eigenvalues();                // diag(val)
eig.eigenvectors();               // vec

Eigen 的一些矩阵操作

trace(); // 求迹
inverse(); // 求逆矩阵
determinant(); // 求行列式 
退出移动版