slam学习之Eigen库的简单总结

1、一句话简述Eigen

  Eigen是一个C++开源线性代数库,slam中使用Eigen库进行矩阵、向量乃至旋转矩阵与变换矩阵的表示和计算

2、Eigen在ubuntu中的安装

  Eigen库在ubuntu软件源中提供,所以可以直接在终端输入以下命令进行安装:


sudo
apt-get install libeigen3-dev

3、Eigen在ubuntu中的简单应用

  一般而言,库是由头文件和库文件组成,在编译时不仅在可执行程序中声明库的头文件,而且要将可执行文件与库文件链接,而Eigen是一个由只用头文件搭建起来的库,在使用时只需引入Eigen的头文件即可,不需要链接库文件。Eigen库的头文件默认在“/usr/include/eigen3”中,如果不确定可以输入以下命令查找:


sudo
updatedb

locate
eigen3

  下面引入一段简单代码来表达Eigen的使用:

  #include <iostream>
  using namespace std;
  #include <ctime>
  #include <Eigen/Core>
  #include <Eigen/Dense>

  int main( int argc, char** argv )
{    
    //声明矩阵:一个名为m_23的单精度2行3列矩阵,Eigen::Matrix为声明矩阵的一个模板类,前三个参数为:数据类型,行,列。
    Eigen::Matrix<float, 2, 3> m_23;

//基于Eigen::Matrix,有一些内置的类型比如Eigen::Vector3f,指的是:Eigen::Matrix<float,3,1>,表示一个三维向量。其中f表示单精度,d表示双精度。
    Eigen::Vector3d v_3d;  //声明一个三维向量v_3d

//类似地,Matrix3d 实质上是 Eigen::Matrix<double, 3, 3>
    Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero();  //声明一个三维矩阵并初始化为零
    
    //输入数据
    m_23 << 1,2,3,4,5,6;
    //输出
    cout<<m_23<<endl;

// 用for语句访问矩阵中的元素
       for (int i=0; i<2; i++)
     {
            for (int j=0; j<3; j++)
                cout<<m_23(i,j)<<"\t";
             cout<<endl;
     }

//矩阵和向量相乘
    v_3d << 1, 2, 3;
    //要保证输出数据类型跟输入数据类型一致,m_23前面声明为单精度,故用cast()显式转换为双精度。
    Eigen::Matrix<double, 2, 1> result = m_23.cast<double>() * v_3d;
    cout << result << endl;

//矩阵运算比较简单
    matrix_33 << 1,2,3,4,5,6,7,9,9;      // 声明一个矩阵(可以多试几种矩阵,看下面的计算输出什么结果)
    cout << matrix_33 << 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;    // 行列式

//如何解方程:matrix_33*X = v_3d,有两种方法:直接求逆法,矩阵分解法。下面分别求解并计时验证效率,可知直接法比较耗时,运算量大
    
    clock_t time_stt = clock();   // 计时(直接求逆法)
    Eigen::Matrix<double,3,1> X= matrix_33.inverse()*v_3d;
    cout<<"方程解为:\n"<<X<<endl;
    cout <<"计算所需时间:" << 1000* (clock() - time_stt)/(double)CLOCKS_PER_SEC << "ms"<< endl;

  // 矩阵分解法
     time_stt = clock();  //计时
        X = matrix_33.colPivHouseholderQr().solve(v_3d);
    cout<<"方程解为:\n"<<X<<endl;
       cout <<"计算所需时间:" << 1000* (clock() - time_stt)/(double)CLOCKS_PER_SEC << "ms"<< endl;
    return 0;

}

  

将程序文件保存命名为eigenMatrix.cpp,在ubuntu中我们使用cmake编译,CMakeLists.txt文件编辑如下:


cmake_minimum_required( VERSION 2.8 )

#创建名为useEigen的工程

project( useEigen )  

# 添加Eigen头文件

include_directories( "/usr/include/eigen3" )

#添加要运行的程序

add_executable( eigenMatrix eigenMatrix.cpp )

之后在终端通过cmake编译得到可执行文件,运行可执行文件得到运行结果如下:

1 2 3

4 5 6

1 2 3

4 5 6

14

32

1 2 3

4 5 6

7 9 9

1 4 7

2 5 9

3 6 9

46

15

10 20 30

40 50 60

70 90 90

-1.5 1.5 -0.5

1 -2 1

0.166667 0.833333 -0.5

6

方程解为:

0

0

0.333333

计算所需时间:0.043ms

方程解为:

1.14652e-15

-9.12374e-16

0.333333

计算所需时间:0.042ms

参考:《视觉slam十四讲,从理论到实践》,高翔,张涛编著。

原文地址:https://www.cnblogs.com/wang-cheng-blog/p/10661073.html

时间: 2024-11-13 08:06:49

slam学习之Eigen库的简单总结的相关文章

《视觉slam十四讲》之第3讲-实践Eigen库

<视觉slam十四讲>之第3讲-实践Eigen库 Eigen库的安装 sudo apt-get install libeigen3-dev 注:Eigen是一个由纯头文件搭建的线性代数库,头文件安装路径为/usr/include/eigen3/. 实例1:Eigen的基础运算 #include <iostream> #include <ctime> #include <Eigen/Core> // Eigen 部分 #include <Eigen/De

linux学习 建立静态库,动态库,写简单的makefile

建立静态库 建立四个文件 bin(可执行文件),lib(库),include(头文件),src(放源文件) 这里的起的库明为add 在src文件中执行 1)gcc -c add.c //编译add.c源文件生成add.o目标文件 2)ar crsv ../lib/ libadd.a add.o //对目标文件*.o进行归档,生成lib*.a, 把这个生成文件放在lib里 3)gcc -o main main.c -L(大些的爱偶,放库的路径)../lib   –l(小写的爱偶,库名为add) a

c++处理矩阵操作:Eigen库初步学习使用

前言: Eigen 是一个线性算术的C++模板库,包括:vectors, matrices, 开源以及相关算法.功能强大.快速.优雅以及支持多平台,可以使用该库来方便处理一些矩阵的操作,达到类似matlab那样的快捷.现在已经发展到Eigen3了,目前最新版本为Eigen 3.1.2. Eigen使用预备工作: 首先到Eigen官网上下载Eigen源码包,下载后解压完直接放到自己平时软件所在的目录下,不需要安装.Eigen下载地址为:http://eigen.tuxfamily.org/inde

c++学习笔记2(c++简单程序)

c++的简单程序 练习一: #include <iostream>int main(){std::cout<<"你好c++\n";int x;std::cin>>x;std::cout<<x;return 0;} #:预处理标志,对文本进行预处理操作:预处理标志表示该行代码要最先进行处理,要在编译器编译代码之前运行.include:预处理指令 表示将<>内的文件读入. <...>头文件iostream(输入输出流)

DuiLib学习笔记2——写一个简单的程序

我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新建一个win32项目 去DuiLib根目录,把目录下DuiLib文件夹拷贝到新建项目的根目录.再把这个项目添加进我们解决方案中. 从教程里面把以下代码粘贴到我们项目的stdafx.h中 // Duilib使用设置部分 #pragma once #define WIN32_LEAN_AND_MEAN

[转载]SharePoint 2013搜索学习笔记之搜索构架简单概述

Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上,组成适合需求的Sharepoint搜索场,搜索场的体系结构设计主要参考量是爬网内容量,微软根据爬网内容量不同将搜索场分为大型场,中型场和小型场,更多详细信息可参考: SharePoint Server 2013 中的搜索概述和在SharePoint Server 2013 中规划企业搜索体系结构.

用vs2010编译vigra静态库及简单使用举例

1.  从 http://ukoethe.github.io/vigra/ 下载最新源代码vigra-1.10.0-src-with-docu.tar.gz,并加压缩到D:\soft\vigra,生成vigra-1.10.0文件夹: 2.  从http://www.cmake.org/cmake/resources/software.html下载CMake并安装: 3.  打开CMake,Where is thesource code: D:/soft/vigra/vigra-1.10.; Wh

更快学习 JS 的 6 个简单思维技巧

当人们尝试学习 JavaScript , 或者其他编程技术的时候,常常会遇到同样的挑战: 有些概念容易混淆,特别是当你学习过其他语言的时候. 很难找到学习的时间(有时候是动力). 一旦当你理解了一些东西的时候,却很容易再一次忘记. 可以使用的工具甚多且经常变化,所以不知道从哪里开始入手. 幸运的是,这些挑战最终都可以被战胜.在这篇文章里,我将介绍 6 个思维技巧来帮你更快的学习 JavaScript ,让你成为一个更快乐更多产的程序员. 1.不要让将来的决定阻止你进步 对于很多学习 JavaSc

调用MyFocus库,简单实现二十几种轮播效果

一.首先点击这里下载myFocus库文件,标准文件库就行了,很小仅仅1.4M. myFocus库有以下的好处: a . 文件小巧却高效强大,能够实现二十几种轮播的效果. b . 极其简单的使用,只需要调用就可以使用,下面会介绍方法. c . 灵活的设置,很多参数可以提供设置,比如不想要文字提示,设置高度为0....更多参数适用请见网站教程页面. 二.下载下来之后,解压,看到一个文件夹,如下图所示: 对此文件夹进行一下说明:a . 打开js文件夹,然后有个js文件,就是我们最开始要调用的myfoc