SLAM系列文章之eigen库
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- SLAM系列文章之eigen库
- 前言
- 一、eigen库是什么?
- 二、Eigen使用
- 1.矩阵的声明
- 2.Eigen矩阵的操作
- 三.几何模块
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、eigen库是什么?
矩阵计算开源库。里面有很多库。
如Eigen/Core 这个库里面有矩阵运算的Matrix类和Array类,矩阵和数组运算。
Eigen/Dense 这个库包含了其他库,
二、Eigen使用
1.矩阵的声明
#include<Eigen/Core>
#include<Eigen/Dense>
进行矩阵运算,求逆,特征值
Eigen中所有向量和矩阵都是Eigen::Matrix,是一个模板类,
前三个参数:数据类型,行,列,
如何声明一个矩阵,固定大小的矩阵,和不固定大小的矩阵
如:声明一个2*3的float矩阵
Eigen::Matrix<float,2,3> matrix_23;
特例:
三行一列的向量
Eigen::Vector3d v_3d:
三行三列的向量
Eigen::Matrix3d matrix_3d = Eigen::Matrax3d::Zero();//初始化为0
不确定矩阵大小,如输入图片的时候,使用动态矩阵
Eigen::Matrix<double,Eigen::dynamic,Eigen::dynamic> matric_dynamic;
随机数矩阵
matrix_33 = Eigen::Matrix3d::Random(); //随机数矩阵
更简单的声明:
Eigen::MatrixXd matrix_x;
2.Eigen矩阵的操作
输入数据(初始化)
matrix_23 << 1,2,3,4,5,6;
输出数据
cout<<matrix_23<<endl;
访问数据matrix(i,j)在Eigen里,矩阵类型要相同,
Eigen::Matrix<double,2,1> result =matrix_23.cast()*v_3d;转置
matrix_33.transpose();
各元素和
matrix_33.sum();
迹
matrix_33.trace();
数乘
10*matrix_33;
逆
matrix_33.inverse();
行列式
matrix_33.determinant();
特征值
实对称矩阵可以对角化成功
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver(matrix33.transpose()*matrix_33);
cout<<eigen_solver.eigenvalues();
cout<<eigen_solver.eigenvectoe();
解方程
求解matrix_NN*x=v_Nd
N由随机数生成
//声明一个矩阵,再初始化
Eigen::Matric<double,MATRIX_SIZE,MATRIX_SIZE> matrix_NN;
matrix_NN = Eigen::MatrixXd::Random(MATRIX_SIZE,MATRIX_SIZE);
//声明一个向量,再初始化
Eigen::Matrix<double,MATRIX_SIZE,1> v_Nd;
v_Nd = Eigen::MatrixXd::Random(MATRIX_SIZE,1);
用矩阵分解求,如QR分解
x = matrix_NN.colPivHouseholderQr().solver(v_Nd);
三.几何模块
#include <Eigen/Geometry>
Geometry模块提供了几何模块的使用方法(旋转和平移)
3d旋转矩阵
Eigen::Matrix3d rotation_matrix=Eigen::Matrix3d::Identity();
旋转向量
Eigen::AngleAxisd rotation_vector(M_PI/4,Eigen::Vector3d(0,0,1)); //沿着z轴旋转45
rotation_vector.matrix();转换成矩阵
//用变换矩阵进行坐标变换
Eigen::Vector3d v_transformed = T*v;
v_transformed.transpose();四元数
可以直接把AngleAxis赋值给四元数
Eigen::Quaterniond q=Eigen::Quaterniond(rotation_vector)
q.coeffs();//顺序是(x,y,z,w) 前三者为虚部q=Eigen::Quaterniond(rotation_matrix);
q.coeffs();//使用四元数旋转一个向量,使用重载的乘法
v_rotated = q*v;
v_rotated.transpose();
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。