我正在尝试使用Apache Commons Math Library找到一个矩阵的逆。
下面是我的尝试:
当我运行这个程序时,出现了以下错误:
根据上面的错误信息,当我打开
然而,通过 WolframAlpha 进行快速检查可以发现这个矩阵具有非零行列式并且确实具有逆矩阵: 所以问题是 - 我做错了什么,如何找到矩阵的逆?我使用的求解器有问题吗?
下面是我的尝试:
BigReal[][] leftMatrixData = new BigReal[][] {
{ new BigReal(1), new BigReal(0), new BigReal(0), new BigReal(0) },
{ new BigReal(1), new BigReal(0), new BigReal(1), new BigReal(0) },
{ new BigReal(1), new BigReal(1), new BigReal(0), new BigReal(0) },
{ new BigReal(1), new BigReal(1), new BigReal(1), new BigReal(1) },
};
FieldMatrix<BigReal> leftMatrix = MatrixUtils.createFieldMatrix(leftMatrixData);
FieldMatrix<BigReal> leftMatrixInverse = new FieldLUDecomposition<>(leftMatrix)
.getSolver()
.getInverse();
当我运行这个程序时,出现了以下错误:
org.apache.commons.math3.exception.MathArithmeticException: zero not allowed here
at org.apache.commons.math3.util.BigReal.divide(BigReal.java:255)
at org.apache.commons.math3.util.BigReal.divide(BigReal.java:39)
at org.apache.commons.math3.linear.FieldLUDecomposition.<init>(FieldLUDecomposition.java:160)
根据上面的错误信息,当我打开
FieldLUDecomposition.java
文件的第160行时,我发现该库认为这个矩阵是奇异的,即它认为它没有逆矩阵:public T getDeterminant() {
if (this.singular) { <---- this is line 160
return (FieldElement)this.field.getZero();
} else {
int m = this.pivot.length;
T determinant = this.even ? (FieldElement)this.field.getOne() : (FieldElement)((FieldElement)this.field.getZero()).subtract(this.field.getOne());
然而,通过 WolframAlpha 进行快速检查可以发现这个矩阵具有非零行列式并且确实具有逆矩阵: 所以问题是 - 我做错了什么,如何找到矩阵的逆?我使用的求解器有问题吗?