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