根据这个密码。利用库可以找到伪逆.
RealMatrix Swinv = new LUDecomposition(Sw).getSolver().getInverse(); // MATLAB: Swinv = pinv(Sw)
但是即使Sw
是正方形的,我也可以得到异常org.apache.commons.math3.linear.SingularMatrixException:
根据文档,这个getInverse()
是伪逆的。
得到分解矩阵的伪逆。
这等于分解矩阵的逆,如果存在这样的逆。
如果不存在这样的逆,则结果具有类似于逆的性质。
特别是,在这种情况下,如果分解的矩阵是A,那么方程组(A=b)可能没有解,或者有许多解。如果它没有解,则伪逆( A^+ )给出“最近”的解(z= A^+ b ),这意味着(\左_~~_‘“最小”。如果存在多个解,则(z= A^+ b)是最小的解,这意味着(\左\z\右|_2 )最小。
那我在这里该怎么办?我要找到伪逆。但是我仍然有一个错误,因为Sw
是单数的。
发布于 2020-05-18 12:32:30
所以我不知道你是从哪里得到的,LUDecomposition
的求解器产生了伪逆。实际上,如果您查看代码,您可以看到这只适用于如果存在“精确线性意义上的”解。
相反,您应该首先创建一个SingularValueDecomposition
SingularValueDecomposition svd = new SingularValueDecomposition(A);
然后得到这个奇异值分解所创建的分解求解器,
DecompositionSolver solver = svd.getSolver();
那么你可以:
RealMatrix pinv = solver.getInverse();
RealVector x = decompositionSolver.solve(b);
RealMatrix X = decompositionSolver.solve(B);
https://stackoverflow.com/questions/61774858
复制