我对C ++中的Eigen库有疑问。实际上,我想计算稀疏矩阵的逆矩阵。 当我在Eigen中使用Dense矩阵时,我可以使用.inverse()运算来计算密集矩阵的逆。 但是在稀疏矩阵中,我无法在任何地方找到逆运算。有谁知道计算稀疏矩阵的逆?帮我。
答案 0 :(得分:9)
您无法直接执行此操作,但您始终可以使用其中一个稀疏解算器进行计算。我的想法是解决A*X=I
,其中我是单位矩阵。如果有解,X将是你的逆矩阵。
The eigen documentation有一个关于稀疏求解器以及如何使用它们的页面,但基本步骤如下:
SolverClassName<SparseMatrix<double> > solver;
solver.compute(A);
SparseMatrix<double> I(n,n);
I.setIdentity();
auto A_inv = solver.solve(I);
答案 1 :(得分:1)
它在数学上没有意义。
稀疏矩阵不一定具有稀疏逆。
这就是为什么这个方法不可用的原因。
答案 2 :(得分:0)
您可以找到有关稀疏复杂矩阵的逆的示例
我使用的是SimplicialLLT类,
你可以找到bellow的其他课程
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;
}
答案 3 :(得分:0)
@Soheib和@MatthiasB的答案的小扩展,如果您使用jest.mock('react-native-google-analytics-bridge');
import {GoogleAnalyticsTracker} from 'react-native-google-analytics-bridge';
describe('testing mocking', () => {
it ('should return undefined when mocked', () => {
let tracker2 = new GoogleAnalyticsTracker(null);
expect(tracker2).toBe(undefined);
})
})
使用SparseLU而不是SimplicialLLT或SimplicialLDLT更好,他们会产生错误的答案我在浮动矩阵上
答案 4 :(得分:0)
请注意,稀疏矩阵的逆不一定是稀疏矩阵,因此如果您正在处理大型矩阵(如果您使用稀疏表示,这很可能)那么这将是昂贵的。仔细考虑您是否真的需要实际的逆矩阵。如果您打算使用逆矩阵来求解方程组,那么您不需要实际计算逆矩阵并将其相乘(使用通常名为 solve
的方法并提供右手-方程的一边)。如果您需要 Fisher 矩阵的逆求协方差,请尝试近似。