【发布时间】: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