【问题标题】:Exception in thread "main" java.lang.RuntimeException: Matrix is singular线程“主”java.lang.RuntimeException 中的异常:矩阵是单数
【发布时间】:2011-06-09 09:07:19
【问题描述】:

我只是想按照 JAMA 文档创建一个 3x3 矩阵的逆矩阵。但每次它给我以下错误 -

Exception in thread "main" java.lang.RuntimeException: Matrix is singular

有人可以在这方面帮助我吗?

【问题讨论】:

  • 你的 3x3 矩阵是什么?我的猜测是它不可逆 - 请参阅 en.wikipedia.org/wiki/Invertible_matrix
  • 这很模糊:您的问题没有引用任何源代码,也没有堆栈跟踪。另外,您指的是什么 JAMA 文档?

标签: java matrix jama


【解决方案1】:

Jama 的文档不是很好。

其实翻看源码你会发现Matrix.inverse()最终调用了LUDecomposition.solve(...),代码说:

  270      /** Solve A*X = B
  271      @param  B   A Matrix with as many rows as A and any number of columns.
  272      @return     X so that L*U*X = B(piv,:)
  273      @exception  IllegalArgumentException Matrix row dimensions must agree.
  274      @exception  RuntimeException  Matrix is singular.
  275      */
  277      public Matrix solve (Matrix B) {
  278         if (B.getRowDimension() != m) {
  279            throw new IllegalArgumentException("Matrix row dimensions must agree.");
  280         }
  281         if (!this.isNonsingular()) {
  282            throw new RuntimeException("Matrix is singular.");
  283         }

正如维基百科所说:

“在线性代数中,如果存在一个 n×n 矩阵 B 满足 AB = BA = I n 其中 In 表示 n×n 单位矩阵,使用的乘法是普通矩阵乘法。”

简而言之,单数意味着不可逆。


如果您对 JAMA 不满意,请查看 Apache Commons Maths 库,尤其是 Linear Algebra module

【讨论】:

  • 谢谢...我去图书馆看看。
【解决方案2】:

如果您可以计算矩阵的行列式,您会发现它为零(或接近零)。

您也许可以通过检查来判断。如果一行与另一行成比例,则您的矩阵不可逆。

3x3 很容易手动反转。试一试,看看哪里出了问题。

尝试 SVD 解决方案。它会告诉你矩阵的零空间是什么。

【讨论】:

  • 谢谢...这有帮助..实际上是的,我没有意识到我生成的 3x3 矩阵得到了这样一个值,其中一行与另一行成正比。显然我解决了这个问题。 :)
  • 对,一行与另一行成比例表示您可以除以比例值并最终得到左侧相同的两个表达式。如果他们有相同的右手边,你真的只有两个方程。如果他们有不同的右手边,这是不一致的。您可以用非数学术语来看待问题:x+y+z = 4 和 x+y+z = 6 不可能同时为真。
【解决方案3】:

嗯,它告诉了你需要知道的一切:你试图求逆的矩阵是单数的。

奇异矩阵是不可逆的。

如果您认为您的矩阵不是单数的,请发布它,我们会看看。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-21
    • 2017-01-06
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多