这里是Eigen库的一些基础语法,摘自《视觉SLAM十四讲》,修改了书中代码的一些bug,部分地方添加了一些自己的理解。

头文件相关

#include <Eigen/Core>  // Eigen 核心部分
#include <Eigen/Dense>    // 稠密矩阵的代数运算(逆,特征值等)
#include <Eigen/Geometry> // 提供了各种旋转和平移的表示

CMake注意事项

include_directories("/usr/include/eigen3")

定义相关

定义一个2×32\times 32×3的float矩阵:

Eigen::Matrix<float, 2, 3> matrix_23;

定义一个3维的double向量:

Eigen::Vector3d v_3d;
// 等价于:Matrix<double, 3, 1> vd_3d;

定义一个3×33\times 33×3的double矩阵,同时初始化为0:

Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero();;

定义一个大小不定的矩阵:

// 方式1
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix_dynamic;
// 方式2
Eigen::MatrixXd matrix_x;

初始化方法

// 输入数据(初始化)
matrix_23 << 1, 2, 3, 4, 5, 6;
// 输出
cout << "matrix 2x3 from 1 to 6: \n" << matrix_23 << endl;

输出:

matrix 2x3 from 1 to 6:
1 2 3
4 5 6

初始化为随机数:

matrix_33 = Eigen::Matrix3d::Random();

访问矩阵元素

用括号来访问矩阵第i行,第j列的元素(i, j起始均为0):

matrix_23(i, j)

显式类型转换

Eigen不允许两种不同类型的矩阵相乘,必须要做显式类型转换,如:

Eigen::Matrix<double, 2, 1> result = matrix_23.cast<double>() * v_3d;

一些矩阵操作

转置:

matrix_33.transpose()

求各元素和:

matrix_33.sum()

求迹:

matrix_33.trace()

求逆矩阵:

matrix_33.inverse()

求行列式:

matrix_33.determinant()

求特征值和特征向量:

// 实对称矩阵可以保证对角化成功
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33);
// 特征值
cout << "Eigen values = \n" << eigen_solver.eigenvalues() << endl;
// 特征向量
cout << "Eigen vectors = \n" << eigen_solver.eigenvectors() << endl;

解方程

目标:求解matrix_NN * x = v_Nd这个方程

// 首先定义matrix_NN
Eigen::Matrix<double, 50, 50> matrix_NN = Eigen::MatrixXd::Random(50, 50);
// 然后定义x
Eigen::Matrix<double, 50, 1> x

解法1:直接求逆(慢)

// 直接求逆
x = matrix_NN.inverse() * v_Nd;

解法2:QR分解(快)

x = matrix_NN.colPivHouseholderQr().solve(v_Nd);

解法3:cholesky分解(快,要求正定矩阵)

x = matrix_NN.ldlt().solve(v_Nd);

旋转矩阵

定义一个3×33\times 33×3的double旋转矩阵,同时初始化为单位阵:

Eigen::Matrix3d rotation_matrix = Eigen::Matrix3d::Identity();

旋转向量

定义一个绕z轴旋转45°的旋转向量:

Eigen::AngleAxisd rotation_vector(M_PI / 4, Eigen::Vector3d(0, 0, 1));

注意:旋转向量的底层不直接是Matrix,但运算时可以当作旋转矩阵(因为重载了运算符)

Eigen::Vector3d v(1, 0, 0);
Eigen::Vector3d v_rotated = rotation_vector * v;

matrix()toRotationMatrix()可以转换成旋转矩阵:

rotation_matrix = rotation_vector.matrix()
rotation_matrix = rotation_vector.toRotationMatrix();

旋转矩阵转欧拉角

Eigen::Vector3d euler_angles = rotation_matrix.eulerAngles(2, 1, 0);
// (2, 1, 0)分别对应(X, Y, Z),说明按ZYX顺序旋转

欧式变换、仿射变换、射影变换


定义一个 4×44\times 44×4 欧氏变换矩阵,同时初始化为单位阵:

// 虽然说是3d,实际上是4×4的矩阵
Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
// 按照rotation_vector进行旋转
T.rotate(rotation_vector);
// 把平移向量设成(1,3,4)
T.pretranslate(Vector3d(1, 3, 4));

定义一个 4×44\times 44×4 仿射变换矩阵:Eigen::Affine3d,其余操作与Eigen::Isometry3d一致。有的时候会用Eigen::Affine3d来代替Eigen::Isometry3d

定义一个 4×44\times 44×4 射影变换矩阵:Eigen::Projective3d,其余操作与Eigen::Isometry3d一致。A\boldsymbol{A}A 和 t\boldsymbol{t}t 的赋值方式与Eigen::Isometry3d一致,尚不知道如何赋值aT\boldsymbol{a}^TaT。实际上也不怎么常用。

用变换矩阵进行坐标变换

Eigen::Vector3d v_transformed = T * v;  // 相当于R * v + t

四元数

用旋转向量来初始化四元数(反之亦可):

Eigen::Quaterniond q = Eigen::Quaterniond(rotation_vector);

用旋转矩阵来初始化四元数(反之亦可):

q = Eigen::Quaterniond(rotation_matrix);

普通初始化四元数的方法:

// (w, x, y, z)
Eigen::Quaterniond(0, 1, 0, 0)

cout四元数的方法:

// (x, y, z, w)
cout << q.coeffs().transpose() << endl;

注意:

  • coeffs的顺序是(x,y,z,w)(x,y,z,w)(x,y,z,w),www为实部,前三者为虚部。这个顺序也是内部存储和运算的顺序。
  • 利用Quaterniond()初始化的顺序为(w,x,y,z)(w,x,y,z)(w,x,y,z),顺序是不一样的。

共轭四元数:

// (w, -x, -y, -z)
q.conjugate()

用四元数来旋转一个向量(乘法被重载了,这里的乘法不表示四元数乘法):

// 表示旋转的四元数要归一化
q.normalize();
// 使用四元数旋转一个向量
v_rotated = q * v; // 注意数学上是q * Quaterniond(0, 1, 0, 0) * q共轭

出处:

【Eigen】Eigen库基础语法相关推荐

  1. Python绘图:turtle库基础语法介绍

    目录 一.turtle库的导入 二.绘图命令介绍 1.  画布属性设置 2.  画笔属性设置 3.  移动画笔和转角绘图 4.  图形绘制与图形填充 三.turtle绘图实例:绘制太阳花 Python ...

  2. SLAM——之Eigen函数库

    0. Eigen/四元数/欧拉角/旋转矩阵 相关系列文章 SLAM--之Eigen入门(矩阵运算及几何模块) SLAM--之Eigen函数库,一个相对复杂的EIgen使用实例 SLAM--Eigen函 ...

  3. Eigen教程1 - 基础

    Eigen教程1 - 基础 参考:https://blog.csdn.net/xuezhisdc/article/details/54619853 固定大小的矩阵和向量 /** 参考链接:http:/ ...

  4. Eigen 矩阵运算库在实际项目中的使用

    Eigen 矩阵运算库在实际项目中的使用情况如何? 心血来潮,试了试纯模板技术写的 Eigen 并作了简单的性能测试,三个 1000 阶的方阵连乘运算 Eigen 比 MATLAB 快了一倍,比 Op ...

  5. Eigen/Matlab库矩阵运算方法

    Eigen/Matlab库矩阵运算方法 Eigen库包含头文件简介: Core 有关矩阵和数组的类,有基本的线性代数(包含 三角形 和 自伴乘积 相关),还有相应对数组的操作. Geometry 几何 ...

  6. 10.16 my学习日记 (XPath的基础语法,lxml库的应用)

    10.16 my学习日记(XPath的基础语法,lxml库的应用) XPath的基础语法 XPath查找标签 XPath谓语 lxml库在爬虫中的应用 etree库etree_Element对象 使用 ...

  7. 前端学PHP之正则表达式基础语法

    前面的话 正则表达式是用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作.在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本 ...

  8. python 条件表达式换行_Python基础语法 - LongKing-Xu的个人空间 - OSCHINA - 中文开源技术交流社区...

    python基础语法 一.标识符 在Python中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. 在Python中的标识符是区分大小写的. 在Python中以下划线开头的标识符是有 ...

  9. python使用缩进作为语法边界-重庆铜梁高校邦数据科学通识课【Python基础语法】答案...

    重庆铜梁高校邦数据科学通识课[Python基础语法]答案it8p 重庆铜梁高校邦数据科学通识课[Python基础语法]答案 关注公众号{帅搜}即可查询答案 支持:网课,智慧树,知到,超星,尔雅,学习通 ...

最新文章

  1. C语言:随笔7--预处理命令
  2. 四百元值不值——论小米2A与2S
  3. html编写个人博客_第 06 篇:博客从“裸奔”到“有皮肤”
  4. 软件测试的艺术第三章总结
  5. 芦溪中学2021高考成绩查询,三台县芦溪中学2021年招生简章
  6. HttpClient和DefaultHttpClient
  7. python3.7是什么_Python 3.7 有什么新变化
  8. wether.html5.qq.com,人教版英语九年级全一册Unit 1单元测试卷及参考答案解析(含听力...
  9. 聊聊redo log是什么?
  10. Android访问数据库(SQL Server 和 MySQL)
  11. Spring事务—方法调用事务回滚
  12. 【多题合集】【loliの模拟赛】排列组合大套餐
  13. Lucene全文检索(一)
  14. 【比赛分享】互联网新闻情感分析复赛top8(8/2745)解决方案及总结
  15. 机器学习:Kmeans聚类算法总结及GPU配置加速demo
  16. 【模拟】1177.正方形
  17. Temporal Action Detection with Multi-level Supervision UFA论文阅读笔记
  18. 在虚拟机上部署discuz论坛系统
  19. 10dayC语言项目 《后宫选妃》
  20. 这帖子,程序员的痛心疾首,我明臣哭了.

热门文章

  1. 名片管理系统V 1.0源码分享
  2. 致我们即将逝去的青春,文字控吧
  3. 二叉树由两种遍历推出另一种遍历
  4. 创建自己的 OSM.Planet 街道级别地图服务器,汉化地名避免万国语
  5. Lua学习——Coroutine协程
  6. jsp的request用法
  7. Windows10下载更新一直卡在0%解决方法
  8. Python: 命令行格式化打印之表格
  9. NBIS单细胞教程:质控(一)
  10. android 自定义 snackbar,自定义顶部SnackBar