線性代數Eigen庫安裝使用教程
簡介
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及以內的。