参考:http://eigen.tuxfamily.org/dox/group__QuickRefPage.html
http://eigen.tuxfamily.org/dox/GettingStarted.html
1.简介
Eigen是有关线性代数计算的C++模板库,里面还包含了基本的矩阵、数组的定义和使用,以及矩阵的各种分解、特征值、特征向量、行列式的计算。基本涵盖了各种需要对矩阵的操作,可以说是个C++版的matlab。
模块和头文件
Eigen库被分为了一个Core模块和几个其他额外的模块,每个模块都有对应的头文件,使用时需要进行包含。其中通过Dense和Eigen头文件可以很方便的使用其他的模块,因此一般情况下使用这俩就够了。
简单的例子
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main() {
Eigen::MatrixXd m(2, 2);
m(0, 0) = 1;
m(0, 1) = 2;
m(1, 0) = 3;
m(1, 1) = 4;
cout << m << endl;
return 0;
}
例子解释:Eigen的头文件定义了多种类型的数据,但是当仅仅是简单的使用时,使用MatrixXd类型就够了。这个类型表示矩阵的尺寸是任意的,即每个元素都是double类型的数据。代码中首先定义了2x2的矩阵,并直接给每个元素赋值,元素的下标和数组相同,都是从0开始,程序的输出为
1 2
3 4
第二个例子
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main() {
// Random(Index rows, Index cols);
Eigen::MatrixXd m1 = Eigen::MatrixXd::Random(3, 3);
// Constant(Index rows, Index cols, const Scalar& value);
// (-1,1)+1.2 = (0.2,2.2)
// (0.2,2.2)*50 = (10,110)
m1 = (m1 + Eigen::MatrixXd::Constant(3, 3, 1.2)) * 50;
cout << "m1 = " << endl << m1 << endl;
VectorXd v(3);
v << 1, 2, 3;
cout << "m1*v = " << endl << m1 * v << endl;
return 0;
}
程序中定义了一个任意尺寸的矩阵,并使用Random函数进行初始化,接着对矩阵的元素进行缩放,改变了范围,注释的部分是我猜测的,感觉应该是对的!然后定义一个有3个元素的向量,可以使用 << 输入向量的数据,之后输出了矩阵和向量相乘的结果,程序输出为
m1 =
94.0188 89.844 43.5223
49.4383 101.165 86.823
88.3099 29.7551 37.7775
m1*v =
404.274
512.237261.153
这段代码还可以用另一种写法
他们实现的功能是相同的,第一种方法中矩阵和向量的尺寸是任意的,第二种是固定大小的。使用固定大小尺寸的矩阵或向量会有两点好处:首先编译更快,其次是编译器可以做更加严格的检查,比如当你用4x4的矩阵和一个3维向量相乘时,编译器会报错。#include <iostream> #include <Eigen/Dense> using namespace Eigen; using namespace std; int main() { Matrix3d m2 = Matrix3d::Random(); m2 = (m2 + Matrix3d::Constant(1.2)) * 50; cout << "m2 =" << endl << m2 << endl; Vector3d v1(1, 2, 3); cout << "m2 * v1 =" << endl << m2 * v1 << endl; return 0; }