我是靠谱客的博主 斯文胡萝卜,最近开发中收集的这篇文章主要介绍Eigen学习笔记(1)-入门,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

原文:Eigen官网-Getting started

Eigen 是一个基于C++的线性代数库,其中实现大量常用的线性代数算法,包括常规矩阵计算,矩阵变换,矩阵分解,矩阵块操作。Eigen 广泛地应用在开源项目中,例如OpenCV,PCL(Point Cloud Library),ROS等。其实Eigen中算法都可以在matlab中找到,但是由于matlab是半开源的。所以,如果想在自己的项目中使用,还是要义无反顾地选择Eigen。Eigen目前的版本是3.3.7(2019.12.09)。

Eigen只包含头文件,因此它不需要实现编译,只需要你include到你的项目,指定好Eigen的头文件路径,编译项目即可。而且跨平台,当然这是必须的。

模块和头文件

Eigen库被分为一个Core模块和其他一些模块,每个模块有一些相应的头文件。 为了便于引用,Dense模块整合了一系列模块;Eigen模块整合了所有模块。一般情况下,include<Eigen/Dense> 就够了。

ModuleHeader fileContents
Core#include <Eigen/Core>Matrix和Array类,基础的线性代数运算和数组操作
Geometry#include <Eigen/Geometry>旋转、平移、缩放、2维和3维的各种变换
LU#include <Eigen/LU>求逆,行列式,LU分解
Cholesky#include <Eigen/Cholesky>LLT和LDLT Cholesky分解
Householder#include <Eigen/Householder>豪斯霍尔德变换,用于线性代数运算
SVD#include <Eigen/SVD>SVD分解
QR#include <Eigen/QR>QR分解
Eigenvalues<include <Eigen/Eigenvalues>特征值,特征向量分解
Sparse#include <Eigen/Sparse>稀疏矩阵的存储和一些基本的线性运算
-#include <Eigen/Dense>包含了Core/Geometry/LU/Cholesky/SVD/QR/Eigenvalues模块
-#include <Eigen/Eigen>包括Dense和Sparse(整个Eigen库)

一个简单的例子

#include <iostream>
#include <Eigen/Dense> 

using Eigen::MatrixXd;

int main()
{
  MatrixXd m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0) + m(0,1);
  std::cout << m << std::endl;
  return 0;
}

编译:
Eigen是不需要进行库连接的,只需要让编译器能找到Eigen的头文件即可,因此Eigen的源代码必须要放到inclue目录下面。当用GCC进行编译时,可以通过-I来指定Eigen文件的路径。

g++ -I /path/to/eigen/ my_program.cpp -o my_program 

当在Linux或者Mac OS X系统下,可以将Eigen源代码放到/usr/local/include目录下,然后直接通过如下指令编译代码:

g++ my_program.cpp -o my_program

结果如下:

  3  -1
2.5 1.5

代码解释:
首先,代码引入了eigen的头文件,这里Eigen/Dense 一次引入了多个常用的模块。

程序首先定义了一个2 x 2的矩阵。根据Eigen的定义 ,MatrixXd,这个类型可以拆成三部分来看,Matrix-X-d,Matrix表示定义的是一个矩阵,X表示定义的矩阵维度不确定,d表示double,指矩阵中每一个元素都是double类型的。m(2,2)指定了矩阵的大小是2x2的。从第9 行到第12 行则为矩阵中的元素进行了赋值操作。

最后输出矩阵。

第二个例子

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
  // 创建一个3 x 3的随机矩阵,每个元素的范围都在(-1,1)之间
  MatrixXd m = MatrixXd::Random(3,3);
  // 将每个元素的范围设置在 (10,110)之间,MatrixXd::Cosntant() 用于产生每个元素都相同的矩阵,这里每个元素都是1.2
  m = (m + MatrixXd::Constant(3,3,1.2)) * 50;
  // 输出m
  cout << "m =" << endl << m << endl;
  // 创建一个长度为 3 的列向量
  VectorXd v(3);
  // 为向量元素赋值,这里Eigen 将 << 操作符重载了。
  v << 1, 2, 3;
  // 矩阵和向量做乘法并输出结果
  cout << "m * v =" << endl << m * v << endl;
}
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
  Matrix3d m = Matrix3d::Random();
  m = (m + Matrix3d::Constant(1.2)) * 50;
  cout << "m =" << endl << m << endl;
  Vector3d v(1,2,3);
  
  cout << "m * v =" << endl << m * v << endl;
}

输出结果如下:

m =
  94 89.8 43.5
49.4  101 86.8
88.3 29.8 37.8
m * v =
404
512
261

上面的例子展示生成矩阵和向量的不同方法,其实向量就是列数为1 的矩阵。

使用固定大小的矩阵或向量有两个好处:(1)编译更快,因为编译器知道矩阵或向量的大小;
(2)指定大小可以进行更为严格的检查,比如你将Matrix4d(4*4 matrix)和Vector3d进行乘法操作。

当然使用太多类别(Matrix3d、Matrix4d、Matrix5d…)会增加编译时间和可执行文件大小,原则对于4*4或者更小的矩阵使用固定大小的矩阵。

参考:

“Eigen教程(1)”
“Eigen学习”

最后

以上就是斯文胡萝卜为你收集整理的Eigen学习笔记(1)-入门的全部内容,希望文章能够帮你解决Eigen学习笔记(1)-入门所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部