gpt4 book ai didi

Java:使用 EJML 的矩阵逆没有按预期工作

转载 作者:行者123 更新时间:2023-12-01 11:17:42 28 4
gpt4 key购买 nike

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

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

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

    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);

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

Type = dense , numRows = 3 , numCols = 3
77.440 -24.640 -8.800
-24.640 7.840 2.800
-8.800 2.800 1.000

Type = dense , numRows = 3 , numCols = 3
NaN -Infinity Infinity
NaN Infinity -Infinity
NaN -Infinity Infinity

true

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

所以我回到 EJML 文档并找到了有关此特定函数的以下信息。

If the algorithm could not invert the matrix then false is returned. If it returns true that just means the algorithm finished. The results could still be bad because the matrix is singular or nearly singular.

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

我能想到的唯一解决方案是在计算后搜索倒矩阵中的 NaN 或无穷大,如果我发现其中有一些有趣的东西,我只需用原始矩阵替换倒矩阵,尽管它看起来并不像非常干净的做法,它会产生合理的结果。

我的问题是:

  • 您能想到针对这种情况的任何解决方案吗?比仅仅使用原始矩阵作为自己的逆矩阵更聪明和明智的东西。

  • 如果没有办法解决这个问题,您是否知道任何其他 Java Matrix 库可以解决这种情况,我不期待引入新库,但它可能是唯一的解决方案如果这成为一个真正的问题。

问候并感谢您的投入!

最佳答案

如果您必须有逆矩阵,您应该尝试使用 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

关于Java:使用 EJML 的矩阵逆没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31605917/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com