使用 Eigen 3.3.3 進行矩陣運算


Eigen是一個能夠進行線性代數運算的C++開源軟件包,包含矩陣和矢量操作,Matlab中對矩陣的大多數操作都可以在Eigen中找到。

最近需要計算厄米特矩陣的逆,基於LLT分解和LDLT分解,自己寫了幾個代碼,但精度不是很高,所以考慮了使用Eigen,精度和准確性還是蠻高的。

網址: http://eigen.tuxfamily.org/index.php?title=Main_Page

1. 如何在代碼中使用Eigen的函數

在Linux中編譯C++代碼,Eigen是不需要安裝的,只需要把它解壓后的路徑添加到編譯C++時頭文件的搜索路徑中即可。

C++ 在編譯時,對頭文件的搜索順序為:

(1) 當前目錄;

(2) g++編譯時在命令行中-I指定的路徑;

(3) C++的環境變量CPLUS_INCLUDE_PATH (C的則是C_INCLUDE_PATH)

(4) 內定目錄 (它不是用$PATH環境變量指定的,而是在安裝gcc時配置的prifix指定的路徑)

基於上述的方法,我們可以將Eigen的路徑保存在環境變量CPLUS_INCLUDE_PATH中:

export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/pwork01/p679fen/applications/eigen"

注:可以將這條命令放入~/.bashrc文件中。

 

2. 使用Eigen求矩陣的逆

Eigen中的操作和函數基於矩陣的不同分為兩種:Dense linear algebra 和 Sparse linear algebra. 這里主要使用Dense matrix.

使用LDLT分解法求解厄米特矩陣的逆(求解線性方程AA-1=I的解):

#include <iostream>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

int main(int argc, char *argv[])
{
    Matrix2f A, Ainv;
    Matrix2f I= Matrix2f::Identity(2,2); // I is an identity matrix
    A << 2,-1,-1,3;
    Ainv= A.ldlt().solve(I);    // ldlt() can be replaced by other decomposition solvers
    cout << "The matrix A is:\n" << A << endl;
    cout << "The inversion of matrix A is:\n" << Ainv << endl;
    return 0;
}

 


免責聲明!

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



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