SLAM系列文章之eigen库

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CN-JackZhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值