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提供了大量能使我们快速便捷地处理数据的函数和方法。