如何从 Apache Commons Math - Java 库中找到伪逆

How do I find the pseudo-inverse from Apache Commons Math - Java library

根据这个代码。它可以使用 Apache Commons 数学库找到伪逆。

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

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

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

Get the pseudo-inverse of the decomposed matrix.

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

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

In particular, in this case, if the decomposed matrix is A, then the system of equations ( A x = b ) may have no solutions, or many. If it has no solutions, then the pseudo-inverse ( A^+ ) gives the "closest" solution ( z = A^+ b ), meaning ( \left \| A z - b \right \|_2 ) is minimized. If there are many solutions, then ( z = A^+ b ) is the smallest solution, meaning ( \left \| z \right \|_2 ) is minimized.

那我应该怎么办呢?我想找到伪逆。但是我仍然得到一个错误,因为 Sw 是单数。

所以我不确定您从哪里得到 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
  2. 这样的方程组
RealVector x = decompositionSolver.solve(b);
  1. 或用它来求解矩阵方程组,如 Ax = B
RealMatrix X = decompositionSolver.solve(B);