[英]How can I calculate inverse of sparse matrix in Eigen library
我有一個關於 C++ 中的 Eigen 庫的問題。 實際上,我想計算稀疏矩陣的逆矩陣。 當我在 Eigen 中使用密集矩陣時,我可以使用 .inverse() 操作來計算密集矩陣的逆。 但是在稀疏矩陣中,我在任何地方都找不到逆運算。 有誰知道計算稀疏矩陣的逆? 幫我。
您不能直接執行此操作,但您始終可以使用其中一種稀疏求解器進行計算。 這個想法是解決A*X=I
,其中 I 是單位矩陣。 如果有解,X 將是你的逆矩陣。 eigen 文檔有一個關於稀疏求解器及其使用方法的頁面,但基本步驟如下:
SolverClassName<SparseMatrix<double> > solver;
solver.compute(A);
SparseMatrix<double> I(n,n);
I.setIdentity();
auto A_inv = solver.solve(I);
它在數學上沒有意義。
稀疏矩陣不一定有稀疏逆矩陣。
這就是該方法不可用的原因。
你可以找到一個關於 Sparse Complex Matrix 逆的例子
我使用了 SimplicialLLT 類,
你可以從下面找到其他課程
http://eigen.tuxfamily.org/dox-devel/group__TopicSparseSystems.html
此頁面可以幫助您為您的工作指定正確的班級名稱(矩陣的速度、准確性和維度)
////////////////////// In His Name \\\\\\\\\\\\\\\\\\\\\\\\\\\
#include <iostream>
#include <vector>
#include <Eigen/Dense>
#include <Eigen/Sparse>
using namespace std;
using namespace Eigen;
int main()
{
SparseMatrix< complex<float> > A(4,4);
for (int i=0; i<4; i++) {
for (int j=0; j<4; j++) {
A.coeffRef(i, i) = i+j;
}
}
A.insert(2,1) = {2,1};
A.insert(3,0) = {0,0};
A.insert(3,1) = {2.5,1};
A.insert(1,3) = {2.5,1};
SimplicialLLT<SparseMatrix<complex<float> > > solverA;
A.makeCompressed();
solverA.compute(A);
if(solverA.info()!=Success) {
cout << "Oh: Very bad" << endl;
}
SparseMatrix<float> eye(4,4);
eye.setIdentity();
SparseMatrix<complex<float> > inv_A = solverA.solve(eye);
cout << "A:\n" << A << endl;
cout << "inv_A\n" << inv_A << endl;
}
@Soheib 和 @MatthiasB 答案的一個小擴展,如果你使用Eigen::SparseMatrix<float>
最好使用 SparseLU 而不是 SimplicialLLT 或 SimplicialLDLT,他們在浮點矩陣上給我錯誤的答案
請注意,稀疏矩陣的逆不一定是稀疏矩陣,因此如果您正在使用大型矩陣(如果您使用稀疏表示,這很可能)那么這將是昂貴的。 仔細考慮您是否真的需要實際的逆矩陣。 如果您打算使用逆矩陣來求解方程組,那么您不需要實際計算逆矩陣並將其相乘(使用通常稱為solve
的方法並提供方程)。 如果您需要 Fisher 矩陣的逆求協方差,請嘗試近似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.