【问题标题】:How do I find the pseudo-inverse from Apache Commons Math - Java library如何从 Apache Commons Math - Java 库中找到伪逆
【发布时间】:2020-08-29 15:49:44
【问题描述】:

根据此代码。它可以使用Apache Commons Math库找到伪逆。

RealMatrix Swinv = new LUDecomposition(Sw).getSolver().getInverse(); // MATLAB: Swinv = pinv(Sw)

但即使Sw 是正方形,我也可以得到异常org.apache.commons.math3.linear.SingularMatrixException:

根据文档,这个getInverse() 是伪逆的。

得到分解矩阵的伪逆。

如果存在这样的逆矩阵,则这等于分解矩阵的逆矩阵。

如果不存在这样的逆,则结果具有类似于逆的属性。

特别是,在这种情况下,如果分解的矩阵是 A,那么 方程组 ( A x = b ) 可能没有解,也可能有很多解。如果 它没有解,则伪逆( A^+ )给出 “最接近”的解决方案( z = A^+ b ),意思是( \left \| A z - b \right \|_2 ) 被最小化。如果有很多解,那么 ( z = A^+ b ) 是最小的解决方案,意思是 ( \left \| z \right \|_2 ) 是 最小化。

那么我应该在这里做什么?我想找到伪逆。但我仍然收到错误,因为Sw 是单数。

【问题讨论】:

    标签: java matrix apache-commons matrix-inverse apache-commons-math


    【解决方案1】:

    所以我不确定你从哪里得到LUDecomposition 的求解器产生伪逆的想法。实际上,如果您查看代码,您会发现这只适用于if a solution exists "in exact linear sense"

    相反,您应该先用

    创建一个SingularValueDecomposition
    SingularValueDecomposition svd = new SingularValueDecomposition(A);
    

    然后得到这个奇异值分解创建的分解求解器,

    DecompositionSolver solver = svd.getSolver();
    

    那么你可以:

    1. 得到伪逆
    RealMatrix pinv = solver.getInverse();
    
    1. 或用它来求解方程组,例如 Ax = b
    RealVector x = decompositionSolver.solve(b);
    
    1. 或使用它来求解诸如 Ax = B 的矩阵方程组
    RealMatrix X = decompositionSolver.solve(B);
    

    【讨论】:

    • 谢谢。但我现在正在使用 OjAlgo。 :)
    猜你喜欢
    • 2016-02-28
    • 2011-06-27
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    相关资源
    最近更新 更多