头文件
#include <eigen3/Eigen/core>
#include <eigen3/Eigen/dense>
#include <eigen3/Eigen/Geometry>
//如果想要省略eigen3,需要在CMakeLists.txt文件当中添加:
include_directories("/usr/include/eigen3")
矩阵定义
Eigen::Matrix matrix_name = Eigen::Matrix <double, 3, 4> //知道矩阵的大小3*4大小的矩阵
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix_notknow_size;//不知道矩阵的大小 ,这样定义
Eigen::MatrixXd matrix_nSize; //更简单地定义矩阵,不知道矩阵的大小。
矩阵数据格式的变换
matrix_nSize.cast<double>() //把矩阵数据格式转换成double格式,因为矩阵只能相同格式地相乘。
基本的矩阵操作:转置、求逆、求迹、求和、数乘、行列式
matrix_nSize.transpose() //转置
matrix_nSize.sum() //矩阵各元素求和
matrix_nSize.trace() //求迹
matrix_nSize.inverse() //求逆
10 * matrix_nSize //矩阵数乘,数乘是可以不同类型来做的.
matrix_nSize.determinant() //求行列式
矩阵特征值求解
matrix_real = Eigen::Matrix3d::Random();
matrix_realSymentry = matrix_real.transpose() * matrix_real;//这是一个实对称矩阵
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver (matrix_realSymentry) //特征求解器
cout << "Eigen values = " << eigen_solver.eigenvalues() <<endl; //输出特征值
cout << "Eigen vectors = " << eigen_solver.eigenvectors() << endl; //输出特征向量
矩阵QR分解求方程的解
x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
/********************************************************
旋转矩阵、旋转向量、四元数的使用
********************************************************/
旋转向量的定义
Eigen::AngleaAxisd rotation_vector (M_PI/4, Eigen::Matrix3d::Identity())
rotation_matrix = rotation_vector.toRoationMatrix();//把旋转向量转换成旋转矩阵
rotation_matrix = rotation_vector.Matrix();// 另外一种旋转矩阵的表达形式
欧拉角
Eigen::vector3d euler_angles = rotation_matrix.eulerAngles(2, 1, 0);// z y x 顺序, yaw, pitch, row;
变换矩阵
Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
T.rotate(rotation_vector);
T.pretranslate(Eigen::Vector3d(1, 3, 4));
cout <<"Transform matrix is \n" << T.matrix() << endl;
cout <<"Rotation vector is \n" << rotation_vector.axis() << endl;
四元数
Eigen::Quaterniond q = Eigen::quaterniond (rotation _vector);
cout << " quaterniond = \n" << q.coeffs() << endl;
v_rotated = q * v;
参考书目《视觉SLAM十四讲:从理论到实践》