如何在特征库中计算稀疏矩阵的逆 我在C++中有一个关于特征库的问题。实际上,我想计算稀疏矩阵的逆矩阵。 当我在Eigen中使用稠密矩阵时,我可以使用.inverse()运算来计算稠密矩阵的逆。 但在稀疏矩阵中,我在任何地方都找不到逆运算。有人知道计算稀疏矩阵的逆吗?帮帮我
这在数学上没有意义 稀疏矩阵不一定有稀疏逆矩阵如何在特征库中计算稀疏矩阵的逆 我在C++中有一个关于特征库的问题。实际上,我想计算稀疏矩阵的逆矩阵。 当我在Eigen中使用稠密矩阵时,我可以使用.inverse()运算来计算稠密矩阵的逆。 但在稀疏矩阵中,我在任何地方都找不到逆运算。有人知道计算稀疏矩阵的逆吗?帮帮我,c++,matrix,sparse-matrix,eigen,eigen3,C++,Matrix,Sparse Matrix,Eigen,Eigen3,这在数学上没有意义 稀疏矩阵不一定有稀疏逆矩阵 这就是该方法不可用的原因。您不能直接执行,但始终可以使用其中一个稀疏解算器进行计算。其思想是求解A*X=I,其中I是单位矩阵。如果有解,X将是你的逆矩阵。 有一个关于稀疏解算器以及如何使用它们的页面,但基本步骤如下: SolverClassName<SparseMatrix<double> > solver; solver.compute(A); SparseMatrix<double> I(n,n); I.se
这就是该方法不可用的原因。您不能直接执行,但始终可以使用其中一个稀疏解算器进行计算。其思想是求解A*X=I,其中I是单位矩阵。如果有解,X将是你的逆矩阵。 有一个关于稀疏解算器以及如何使用它们的页面,但基本步骤如下:
SolverClassName<SparseMatrix<double> > solver;
solver.compute(A);
SparseMatrix<double> I(n,n);
I.setIdentity();
auto A_inv = solver.solve(I);
SolverClassName解算器;
计算(A);
SparseMatrix I(n,n);
I.setIdentity();
自动A_inv=解算器解算(I);
你可以找到一个关于稀疏复矩阵逆的例子
我用的是SimplicialLLT类
你可以在贝娄找到其他的课程
此页面可以帮助您为您的工作提供正确的类名(矩阵的spead、准确性和Dimmension)
//以他的名义\\\\\\\\\\\\\\\\\\\\\\\\\\\
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间特征;
int main()
{
SparseMatrixA(4,4);
对于(int i=0;i是@Soheib和@MatthiasB答案的一个小扩展,如果你使用Eigen::SparseMatrix
最好使用SparseLU,而不是SimplicialLLT或SimplicialLDLT,它们在浮点矩阵上产生了错误的答案,请注意,稀疏矩阵的逆不一定是稀疏的,因此如果你使用大型矩阵(如果使用稀疏表示,这可能会很昂贵)。请仔细考虑是否确实需要实际的矩阵逆。如果要使用矩阵逆解方程组,则不需要实际计算矩阵逆并将其相乘(使用通常命名为solve
的方法,并提供等式的右侧).如果你需要费希尔矩阵的协方差的逆矩阵,试着近似。加入更多的标签,以吸引可能更全面的答案。啊哈..谢谢你,我会尝试,但我简洁的答案是站得住脚的!为什么你需要显式的逆矩阵?这在计算和内存方面都非常昂贵,而且在数字上是不稳定的(除非你的矩阵几乎是幺正的)。如果你想计算A^1*B,那么就使用SparseLU
的求解方法。这同样适用于稠密矩阵,数学上没有区别。这样做的代价更大,特别是当稀疏矩阵往往很大的时候。
////////////////////// 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;
}