我有一个使用JAMA的程序,需要测试一个矩阵是否可以反转。我知道我可以尝试并捕获异常,但这似乎是个坏主意(将 catch 块作为“正常”代码路径的一部分似乎是不好的形式)。
最好也返回逆运算(或以比逆运算更好的 O() 运行)的测试。
我有一个使用JAMA的程序,需要测试一个矩阵是否可以反转。我知道我可以尝试并捕获异常,但这似乎是个坏主意(将 catch 块作为“正常”代码路径的一部分似乎是不好的形式)。
最好也返回逆运算(或以比逆运算更好的 O() 运行)的测试。
一般来说,如果你不能解决矩阵,它是单一的(不可逆的)。我相信 JAMA 这样做的方式是尝试使用 LU 分解来求解矩阵,如果失败,它会为 isSingular() 返回“true”。
实际上并没有一种通用的方法来查看矩阵的元素并确定它是否是奇异的 - 您需要检查每一列以查看它是否与其他列正交(即矩阵的零空间为 0)。LU 分解非常快,通常......但是,有时它需要大量操作。
你有一个你想要克服的实际速度问题吗?
如果抛出异常,你的恢复位置是什么?
如果您进行 LU 分解并发现它是奇异的,您是否捕获异常并尝试 SVD(奇异值分解)代替?
听起来你想估计条件数的倒数。
这个网站看起来有点前途...
另见Golub 和 Van Loan,p。128-130。(如果您没有它的副本,请获取一份。)
...或Higham,他是数值方法的权威。除了解析数学有点困难......就像穿过一片覆盆子灌木丛一样。:/
或者也许检查 Octave 源代码以获取他们的MATLABrcond()
版本。我找到了这篇文章。
对于方阵,您可以只检查其行列式--- Matrix.det()当且仅当矩阵是奇异矩阵时才返回零。当然,您还需要注意病态矩阵。