整理下Eigen庫的教程,參考:http://eigen.tuxfamily.org/dox/index.html
簡介
Eigen是C++中可以用來調用並進行矩陣計算的一個庫,簡單了說它就是一個c++版本的matlab包。
安裝
下載eigen:http://eigen.tuxfamily.org/index.php?title=Main_Page#Download
Eigen只包含頭文件,因此它不需要實現編譯,只需要你include到你的項目,指定好Eigen的頭文件路徑,編譯項目即可。而且跨平台,當然這是必須的。
方案一
下載后,解壓得到文件夾中,Eigen子文件夾便是我們需要的全部;如果你想使用Eigen暫不支持的特性,可以使用unsupported子文件夾。可以把Eigen/unsupported復制到任何你需要的地方。
方案二 安裝改包,其實就是把Eigen/unsupported的內容復制到“/usr/local/include/eigen3”下。在解壓的文件夾下,新建build_dir,執行。
cd build_dir
cmake ../
make install
詳見INSTALL文件即可。
模塊和頭文件
Eigen庫被分為一個Core模塊和其他一些模塊,每個模塊有一些相應的頭文件。 為了便於引用,Dense模塊整合了一系列模塊;Eigen模塊整合了所有模塊。一般情況下,include<Eigen/Dense>
就夠了。
Module | Header file | Contents |
---|---|---|
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(整合庫) |
一個簡單的例子
#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;
}
編譯並執行:g++ main.cpp -I /usr/local/include/eigen3/ -o maincpp
3 -1
2.5 1.5
Eigen頭文件定義了許多類型,所有的類型都在Eigen的命名空間內。MatrixXd代表的是任意大小(X*X)的矩陣,並且每個元素為double類型。
例2: 矩陣和向量
再看另一個例子
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
MatrixXd m = MatrixXd::Random(3,3);
m = (m + MatrixXd::Constant(3,3,1.2)) * 50;
cout << "m =" << endl << m << endl;
VectorXd v(3);
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
程序中定義了一個任意大小的矩陣,並用33的隨機陣初始化。MatrixXd::Constant
創建一個33的常量矩陣。
VectorXd表示列向量,並用逗號初始化語法來初始化。
在看同樣功能的代碼
#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;
}
MatrixXd表示是任意尺寸的矩陣,Matrix3d直接指定了3*3的大小。Vector3d也被直接初始化為[1,2,3]'的列向量。
使用固定大小的矩陣或向量有兩個好處:編譯更快;指定大小可以進行更為嚴格的檢查。當然使用太多類別(Matrix3d、Matrix4d、Matrix5d...)會增加編譯時間和可執行文件大小,原則建議使用4及以內的。