slam学习之Eigen库的简单总结
Posted wang-cheng-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)<<" ";
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<<"方程解为:
"<<X<<endl;
cout <<"计算所需时间:" << 1000* (clock() - time_stt)/(double)CLOCKS_PER_SEC << "ms"<< endl;
// 矩阵分解法
time_stt = clock(); //计时
X = matrix_33.colPivHouseholderQr().solve(v_3d);
cout<<"方程解为:
"<<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十四讲,从理论到实践》,高翔,张涛编著。
!-- p>!-- p>!-- td>
以上是关于slam学习之Eigen库的简单总结的主要内容,如果未能解决你的问题,请参考以下文章
视觉slam学习:初识slam,三维空间刚体运动代码实战,Eigen库的使用