Eigen教程(1)


整理下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及以內的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM