码迷,mamicode.com
首页 > 其他好文 > 详细

slam学习之Eigen库的简单总结

时间:2019-04-06 11:10:13      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:元素   idt   cin   using   线性   nbsp   project   c++   学习   

1、一句话简述Eigen

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

2Eigenubuntu中的安装

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


sudo apt-get install libeigen3-dev


3Eigenubuntu中的简单应用

  一般而言,库是由头文件和库文件组成,在编译时不仅在可执行程序中声明库的头文件,而且要将可执行文件与库文件链接,而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十四讲,从理论到实践》,高翔,张涛编著。

 

slam学习之Eigen库的简单总结

标签:元素   idt   cin   using   线性   nbsp   project   c++   学习   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!