如何从 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();
那么您可以:
- 用
得到伪逆
RealMatrix pinv = solver.getInverse();
- 或者用它来求解像 Ax = b
这样的方程组
RealVector x = decompositionSolver.solve(b);
- 或用它来求解矩阵方程组,如 Ax = B
RealMatrix X = decompositionSolver.solve(B);
根据这个代码。它可以使用 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();
那么您可以:
- 用 得到伪逆
RealMatrix pinv = solver.getInverse();
- 或者用它来求解像 Ax = b 这样的方程组
RealVector x = decompositionSolver.solve(b);
- 或用它来求解矩阵方程组,如 Ax = B
RealMatrix X = decompositionSolver.solve(B);