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; }