1. 程式人生 > >線性代數Eigen庫安裝使用教程

線性代數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及以內的。