文档总目录
本文目录
本文日文原文链接
这是一个十分简略的Eigen入门文章。该文章有两层目的。对于想要尽早开始编码的人来说,该文章是对Eigen库的最简单介绍。你可以把该文章作为教程的第一部份,这愈发详尽的解释了Eigen库。看完这个教程后可以继续阅读TheMatrixclass教程。
怎么安装Eigen
为了使用Eigen,你仅仅须要下载和解压Eigen的源码(有关下载说明,请参阅)。在Eigen的子目录中有头文件,这是你惟一须要的文件。这种文件在所有平台下都是通用的,无需使用Cmake或则安装哪些。
Eigen源码下载链接:,选择你须要的版本下载。
解压后,将其中的Eigen文件夹放在你的头文件目录,即可在你的工程中使用Eigen。
第一个简单的程序
这是一个极其简单的程序。
// 代码索引 2-1-1-1
#include
#include
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;
}
在告诉您怎么编译以后linux文本编辑器,我们将解释该程序。
编译和运行第一个程序
不须要链接任何库。编译上述程序时惟一须要记住的是编译器必须才能找到Eigen头文件。放置Eigen源代码的路径必须在include路径中。使用GCC编译器时linux帮助文档中文,须要用-I选项达到这一目的,因而可以使用如下命令编译程序:
g++ -I /path/to/eigen/ my_program.cpp -o my_program
在linux或则MacOSX中,你也可以使用符号链接或则复制Eigen文件夹到/usr/local/include/。这样,你就可以使用下述命令来编译程序:
g++ my_program.cpp -o my_program
当你运行该程序时,将形成以下输出:
3 -1
2.5 1.5
第一个程序的解释
// 代码索引 2-1-1-1
#include
#include
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;
}
Eigen头文件定义了好多类型,但对于简单的应用程序linux定时器,仅使用类型MatrixXd可能就足够了。它代表任意大小的矩阵,其中X代表任意大小,d代表元素的类型是double。有关可用于表示矩阵的不同类型的概述,请参阅。
头文件Eigen/Dense定义了关于MatrixXd类型及相关类型的成员函数(另请参阅)。头文件中定义的所有的类和函数都在Eigen命名空间中。
上述main函数的第一行申明了一个MatrixXd类型的矩阵m,之后指定了该矩阵的大小为2*2,但没有初始化该矩阵。句子m(0,0)=3代表将该2*2矩阵的左上角元素设置为3。你可以使用圆括弧去访问矩阵中对应的元素,如m(0,0)。根据计算机科学中的惯例linux帮助文档中文,第一个元素的索引为0。
下边的三行代码设置其它三个元素。最后一行代码把矩阵m输送给标准的输出流。
示例2:矩阵和向量
这是另一个反例,它结合了矩阵和向量。包括以下两个版本的程序,输出一样:
版本一:
// 代码索引 2-1-2-1
#include
#include
using Eigen::MatrixXd;
using Eigen::VectorXd;
int main()
{
MatrixXd m = MatrixXd::Random(3,3);
m = (m + MatrixXd::Constant(3,3,1.2)) * 50;
std::cout << "m =" << std::endl << m << std::endl;
VectorXd v(3);
v << 1, 2, 3;
std::cout << "m * v =" << std::endl << m * v << std::endl;
}
版本二:
// 代码索引 2-1-3-1
#include
#include
using Eigen::Matrix3d;
using Eigen::Vector3d;
int main()
{
Matrix3d m = Matrix3d::Random();
m = (m + Matrix3d::Constant(1.2)) * 50;
std::cout << "m =" << std::endl << m << std::endl;
Vector3d v(1,2,3);
std::cout << "m * v =" << std::endl << m * v << std::endl;
}
输出:
m =
94 89.8 43.5
49.4 101 86.8
88.3 29.8 37.8
m * v =
404
512
261
注意,这儿的浮点型数字,官网只截取了后面几位,并且做了四舍五入。
解释第二个反例
版本一首先使用Random()函数初始化了一个3*3的矩阵,其中每一个元素的值都在-1和1之间。下一行使用了一个线性变换,这让所有的值都在10到110之间。函数MatrixXd::Constant(3,3,1.2)返回一个所有元素都是1.2的3*3矩阵。其余部份是标准估算。
main函数的下一行引入了一个新类型VectorXd。它代表一个任意大小的列向量。向量v大小为3而且未初始化。倒数第二行使用了顿号初始化器,解释见中级初始化,此处将向量v初始化为:
v=[123].v=begin{bmatrix}1\2\3end{bmatrix}.v=123.
最后一行让矩阵m和向量v相加之后输出结果。
现今来解释版本二。
版本中学的MatrixXd表示任意大小的矩阵,版本中学的Matrix3d表示固定大小的矩阵(此处为3*3)。由于类型早已固定了矩阵的大小,所以没有必要在构造函数手指定大小,只须要对其初始化即可。
同理,VectorXd代表任意大小的列向量,Vector3d代表固定大小的列向量(此处为3)。同样由于类型早已固定了向量的大小,所以没有必要在构造函数手指定大小,只须要对其初始化即可。
使用固定大小的矩阵和向量有两个优点。编译器会编译出更好(更快)的代码,由于它晓得矩阵和向量的大小。在类型手指定大小还容许在编译时进行更严格的检测。诸如,假如你尝试将一个Matrix4d(4*4矩阵)与一个Vector3d(大小为3的向量)相加,编译器会报错。但是,使用太多类型会降低编译时间和可执行文件的大小。矩阵的大小在编译时也可能是未知的。经验法则是对大小为4*4或更小的矩阵使用固定大小的类型,其他使用任意大小的类型MatrixXd。