【问题标题】:Java: Inverse of a matrix using EJML not working as expectedJava:使用 EJML 的矩阵求逆未按预期工作
【发布时间】:2015-07-24 08:41:08
【问题描述】:

在我开发的 java 项目中,我需要计算矩阵的逆矩阵。为了与其他项目和其他开发人员保持一致,我正在使用 Efficient Java Matrix Library (orj.ejml)。

为了反转矩阵,我使用了来自 org.ejml.ops.CommonOps 的反转,并且我一直工作得很好,直到现在我得到了一个意想不到的结果

我已经隔离了不起作用的情况:

    DenseMatrix64F X = new DenseMatrix64F(3, 3);
    X.setData(new double[]{77.44000335693366,-24.64000011444091,-8.800000190734865, -24.640000114440916,7.839999732971196,2.799999952316285, -8.800000190734865,2.799999952316285,1.0000000000000004});
    DenseMatrix64F invX = new DenseMatrix64F(3, 3);
    boolean completed = CommonOps.invert(X, invX);
    System.out.println(X);
    System.out.println(invX);
    System.out.println(completed);  

我从这个测试中得到的输出是:

类型 = 密集,numRows = 3,numCols = 3
77.440 -24.640 -8.800
-24.640 7.840 2.800
-8.800 2.800 1.000

类型 = 密集,numRows = 3,numCols = 3
NaN -Infinity 无穷
NaN 无穷大 -Infinity
NaN -Infinity 无穷大

是的

我的第一个想法是它可能是一个奇异矩阵,因此不可逆,但在使用不同的计算工具测试相同的矩阵后,我发现它不是奇异的。

所以我回到了 EJML 文档,发现了这个特定函数的以下信息。

如果算法无法反转矩阵,则返回 false。如果它返回 true,则意味着算法完成。结果可能仍然很糟糕,因为矩阵是奇异的或接近奇异的。

而且,在这种特殊情况下,矩阵不是奇异的,但我们可以说它接近奇异。

我能想到的唯一解决方案是在计算后在倒矩阵中搜索 NaN 或 Infinite,如果我在其中发现有趣的东西,我只需将倒矩阵替换为原始矩阵,尽管它似乎不是非常干净的做法,它会产生合理的结果。

我的问题是:

  • 您能想出解决这种情况的方法吗?比仅仅使用原始矩阵作为它自己的逆矩阵更聪明、更明智的方法。

  • 1234563如果这成为一个真正的问题。

感谢您的投入!

【问题讨论】:

  • 看来这不是生产质量功能。您可以应用它两次来查看是否达到了原始矩阵。
  • 这听起来比寻找 Infinites/Nan 更可靠;虽然它需要两倍以上的计算。这将是一个问题,因为这个函数被非常频繁地调用,尽管我已经使用了几个月,但我只遇到过一次这种意外行为,所以我知道这是一个极端情况。感谢您的意见@JoopEggen,我会密切关注我们以提供更好的质量功能。

标签: java matrix matrix-inverse ejml


【解决方案1】:

如果你必须有一个逆,你应该尝试使用 SVD。还要考虑一个伪逆。基本上任何使用 LU 分解的库都会有严重的问题。这是 Octave 的输出。请注意其中两个奇异值几乎为零。 Octave 会给你一个实数的逆,但它是一个糟糕的......

octave:7> cond(B)
ans =    8.5768e+17
octave:8> svd(B)
ans =

   8.6280e+01
   3.7146e-15
   1.0060e-16

inv(B)*B
warning: inverse: matrix singular to machine precision, rcond = 4.97813e-19
ans =

   0.62500   0.06250   0.03125
   0.00000   0.00000   0.00000
   0.00000   0.00000   4.00000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多