1 简单介绍

  • 来自高翔的SLAM十四讲;

    • 代码地址:GitHub - gaoxiang12/slambook
  • 简单介绍,eigen作为矩阵运算常用库的,基本使用;
  • 细节参考注释。

2 文件结构

2.1 CMakeLists.txt

cmake_minimum_required( VERSION 2.8 )
project( useEigen )set( CMAKE_BUILD_TYPE "Release" )
set( CMAKE_CXX_FLAGS "-O3" )# 添加Eigen头文件
include_directories( "/usr/include/eigen3" )# in osx and brew install
# include_directories( /usr/local/Cellar/eigen/3.3.3/include/eigen3 )add_executable( eigenMatrix eigenMatrix.cpp )

2.2 eigenMatrix.cpp

#include <iostream>
using namespace std;
#include <ctime>
// Eigen 部分
#include <Eigen/Core>
// 稠密矩阵的代数运算(逆,特征值等)
#include <Eigen/Dense>#define MATRIX_SIZE 50/****************************
* 本程序演示了 Eigen 基本类型的使用
****************************/int main( int argc, char** argv )
{// Eigen 中所有向量和矩阵都是Eigen::Matrix,它是一个模板类。它的前三个参数为:数据类型,行,列// 声明一个2*3的float矩阵Eigen::Matrix<float, 2, 3> matrix_23;// 同时,Eigen 通过 typedef 提供了许多内置类型,不过底层仍是Eigen::Matrix// 例如 Vector3d 实质上是 Eigen::Matrix<double, 3, 1>,即三维向量Eigen::Vector3d v_3d;// 这是一样的Eigen::Matrix<float,3,1> vd_3d;// Matrix3d 实质上是 Eigen::Matrix<double, 3, 3>Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero(); //初始化为零// 如果不确定矩阵大小,可以使用动态大小的矩阵Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > matrix_dynamic;// 更简单的Eigen::MatrixXd matrix_x;// 这种类型还有很多,我们不一一列举// 下面是对Eigen阵的操作// 输入数据(初始化)matrix_23 << 1, 2, 3, 4, 5, 6;// 输出cout << matrix_23 << endl;// 用()访问矩阵中的元素for (int i=0; i<2; i++) {for (int j=0; j<3; j++)cout<<matrix_23(i,j)<<"\t";cout<<endl;}// 矩阵和向量相乘(实际上仍是矩阵和矩阵)v_3d << 3, 2, 1;vd_3d << 4,5,6;// 但是在Eigen里你不能混合两种不同类型的矩阵,像这样是错的// Eigen::Matrix<double, 2, 1> result_wrong_type = matrix_23 * v_3d;// 应该显式转换Eigen::Matrix<double, 2, 1> result = matrix_23.cast<double>() * v_3d;cout << result << endl;Eigen::Matrix<float, 2, 1> result2 = matrix_23 * vd_3d;cout << result2 << endl;// 同样你不能搞错矩阵的维度// 试着取消下面的注释,看看Eigen会报什么错// Eigen::Matrix<double, 2, 3> result_wrong_dimension = matrix_23.cast<double>() * v_3d;// 一些矩阵运算// 四则运算就不演示了,直接用+-*/即可。matrix_33 = Eigen::Matrix3d::Random();      // 随机数矩阵cout << matrix_33 << endl << endl;cout << matrix_33.transpose() << endl;      // 转置cout << matrix_33.sum() << endl;            // 各元素和cout << matrix_33.trace() << endl;          // 迹cout << 10*matrix_33 << endl;               // 数乘cout << matrix_33.inverse() << endl;        // 逆cout << matrix_33.determinant() << endl;    // 行列式// 特征值// 实对称矩阵可以保证对角化成功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 这个方程// N的大小在前边的宏里定义,它由随机数生成// 直接求逆自然是最直接的,但是求逆运算量大Eigen::Matrix< 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 );clock_t time_stt = clock(); // 计时// 直接求逆Eigen::Matrix<double,MATRIX_SIZE,1> x = matrix_NN.inverse()*v_Nd;cout <<"time use in normal inverse is " << 1000* (clock() - time_stt)/(double)CLOCKS_PER_SEC << "ms"<< endl;// 通常用矩阵分解来求,例如QR分解,速度会快很多time_stt = clock();x = matrix_NN.colPivHouseholderQr().solve(v_Nd);cout <<"time use in Qr decomposition is " <<1000*  (clock() - time_stt)/(double)CLOCKS_PER_SEC <<"ms" << endl;return 0;
}

将选择矩阵R和平移向量t组成相机矩阵(相机位姿/相机外参):

Eigen::Vector3d t=Eigen::Vector3d(2,1, 3.2, 0.5 );Eigen::Matrix3d R;
double angle = 90.0*M_PI/180;
R=Eigen::AngleAxisd(angle,Eigen::Vector3d::UnitZ()).toRotationMatrix();Eigen::Matrix4d curPose = Eigen::Matrix4d::Identity();
curPose.matrix().block<3,3>(0,0)=R;
curPose.matrix().block<3,1>(0,3)=t;

矩阵运算_Eigen使用_基本数据类型相关推荐

  1. C语言_自定义数据类型

    目录 1.自定义数据类型_结构体 1.1 结构体类型的声明 1.1.1 匿名结构体 1.2 结构体的自引用 1.2.1 Typedef结构体重命名: 1.3 结构体变量的定义和初始化 1.4 结构体内 ...

  2. python 矩阵运算 for循环_如何用 Python 科学计算中的矩阵替代循环

    展开全部 因为在Mathematica中使用循环确实是低效的.32313133353236313431303231363533e78988e69d8331333361313961..... 深层次的原 ...

  3. python不支持以下哪种数据类型_下列数据类型中, Python不支持的是()。_学小易找答案...

    [判断题]a={},type(a)结果是 . (5.0分) [简答题]内造型设计 [填空题]水分子之间存在着质子的传递作用,称为水的 作用,这个作用的平衡常数在25度时等于 . [填空题]len('3 ...

  4. python 矩阵运算 for循环_如何用Python科学计算中的矩阵替代循环?

    比如求一个平面稳态导热问题,控制方程就是拉普拉斯方程: (我才发现原来有[插入公式]这个功能) 按照最简单的毅种循环来写就是: def laplace(u): nx, ny = u.shape for ...

  5. date数据类型的正确格式_说说数据类型 上篇日期

    EXCEL内置了多种数据类型,我们今天简单介绍一下日期这个类型. 一.日期类型简介 EXCEL中,日期这一数据类型只能表示公元1900年1月1日开始到公元9999年12月31日为止的日期.不在此范围内 ...

  6. Python基本语法_基本数据类型_序列类型详解

    目录 文章目录 目录 序列 序列的标准操作符 切片操作符[]/[:]/[::] 一个例子 字符串的连接 序列的功能函数 count() 查询一个元素在 Tuple 中的数量 index() 查询元素在 ...

  7. Python基本语法_基本数据类型_数值型详解

    目录 目录 软件环境 Python变量调用的过程 数值型 删除一个数值类型对象 布尔型 Bool 标准整型 Int 长整型 双精度浮点型 Float 复数 数值类型对象的内建功能函数 absNumbe ...

  8. Python基本语法_基本数据类型_字典类型详解

    目录 文章目录 目录 软件环境 字典(Dictionary) 创建一个字典对象 简单的创建 fromkey() 使用 keys 来创建字典 查询 查询字典中 key 映射的 value get() 查 ...

  9. datetime数据类型_系统数据类型

    1.整数型 1. 整数型数据由负整数或正整数组成,如-15. 0.5和2509. 整数型数据使用bigint.int, smallint和tinyint数据类型存储.各种类型能存储的数值的范围如下: ...

  10. python语言的数字类型_基本数据类型数字

    数字也有数字的分类,本节我们会依次来学习整数.浮点数和复数. 1.整数 整数是表述整数的数值,没有小数部分.在Python中,整数包括正整数.负整数和0,在Python中数值超过计算机自身的计算功能时 ...

最新文章

  1. SVG 基本绘图方法总结
  2. Zynq ZC702平台 QSPI + eMMC实现
  3. 数据库表字段命名规则
  4. 让《弹射世界》告诉你,二次元游戏该如何打造社交系统?
  5. Codeforces刷题
  6. css 百分比 怎么固定正方形_你未必知道的49个CSS知识点
  7. 方正计算机软件保护进超级用户,超级用户权限补丁(SuperSU Pro)含刷机包
  8. Vue2.0项目安装Mint-UI - cmd篇
  9. .NET实现之(自动更新
  10. MATLAB rolcus函数,自动控制原理实验报告 .doc
  11. Pulseaudio之meson编译(十二)
  12. C++Primer 学习笔记之关联容器
  13. Linux各个发行版镜像下载
  14. java poi调用excel文件的自动行高来设置自动行高
  15. 金网奖首度跨界心理学,打造最强案例
  16. 网易称暴雪离婚不离身;苹果发布 M2 Pro 和 M2 Max 芯片;滴滴出行 App 已重新上架安卓应用商店 | 极客头条...
  17. 中国第四个南极科考站
  18. 利用DHT网络原理制作bt采集
  19. EdgeInsets.symmetric()
  20. Labview视觉一键尺寸测量仪,多产品,多尺寸,快速编辑, 测量,导出结果

热门文章

  1. vue项目打包,生成dist文件夹,如何修改文件夹的名字
  2. 1、java 的安装及资料下载
  3. oracle常用命令(比较常见好用)
  4. [转] TextField的restrict属性妙用
  5. js怎样递归遍历树形菜单数据
  6. 关于禁用html中a标签的思考
  7. vue中this.$set的用法
  8. SpringMVC自定义拦截器拦截请求后返回中文时乱码
  9. xml+flash图片展示
  10. GCC、VS对C++标准的支持情况总结(转载)