gpt4 book ai didi

java - 调试:使用 Java、ojalgo 进行线性代数计算时出现异常运行时

转载 作者:行者123 更新时间:2023-11-30 02:47:59 25 4
gpt4 key购买 nike

我有一个中等大小的Ax = b我想解决的问题。矩阵A是600x600 .

我的代码解决了该问题,但需要花费异常长的时间。因此,我尝试检查(使用 System.currentTimeMillis() )以查看我的代码在哪里变慢。

事实证明,在A的计算过程中,我执行了命令A = L1 * A0 * L1.transpose() 。该过程几乎消耗了该行总时间的 100%。

奇怪的是,L1 是 600x600单位矩阵(即 A[i,j] = 1 ,如果 i == j0 ,否则)。因此,这行代码实际上不应该花费那么长时间来执行。这个问题应该也很容易绕过

如果我尝试通过注释掉该行并将其替换为 A = A0 来绕过该行,就会发生更奇怪的事情。 。然后代码执行的时间太长(是我杀死它的原始时间的 10 倍)。而且CPU使用率达到100%。

我查了一下,结果是AL1 * A0 * L1.transpose()是相同的。

总而言之,使用我的部分 Java 代码(我使用 ojalgo 库来处理矩阵):

// PrimitiveMatrix A0, L1, b are already calculated.

long startTime = System.currentTimeMillis();
System.out.println((System.currentTimeMillis() - startTime0) / 1000.0); // this prints about 2 seconds, concerning calculations of A0, L1, b.

PrimitiveMatrix A = L1.multiply(A0).multiply((L1).transpose());
System.out.println((System.currentTimeMillis() - startTime0) / 1000.0); // this prints about 67 seconds

// PrimitiveMatrix A = A0; // if this is NOT a comment, then the code has not run after (10+)x my "normal" time

final PrimitiveMatrix x = (A.invert()).multiply(b);

System.out.println((System.currentTimeMillis() - startTime0) / 1000.0); // this prints about 69 seconds

// I checked that
// A0.equals(L1.multiply(A0).multiply((L1).transpose())
// returns true

整个过程大约需要 69 秒,其中 65 秒被消耗在琐碎的计算中,我无法绕过。过去,对于较小的矩阵 (60x60),相同的过程已成功运行。

我不太确定如何继续进行调试尝试。任何帮助将不胜感激。

问题似乎比我最初估计的要深一些。我尝试打印这些矩阵以便上传它们,但随后出现了另一个问题。我发现我的代码在第一次运行 System.out.println(A0.get(aRow,aColumn)); 时崩溃了。 A0是通过将 double 类型的数字添加到维度为 600x600 的零矩阵的每个位置来创建的。此外,还会出现以下消息:

       Exception in thread "main" java.lang.StackOverflowError
at org.ojalgo.matrix.store.SuperimposedStore.get(SuperimposedStore.java:84)
at org.ojalgo.matrix.store.SuperimposedStore.get(SuperimposedStore.java:84)
at org.ojalgo.matrix.store.SuperimposedStore.get(SuperimposedStore.java:84)
...

我想再次强调,当这些矩阵为 60x60 时,相同的进程可以正常运行。 。

最佳答案

我假设您正在使用 BasicMatrix#add(int,int,Number)

您是否调用该方法 600x600 次来构建矩阵?你不应该这样做!

在新版本的 ojAlgo 中,该方法已被删除,因为它经常被误解/误用。

您应该阅读以下内容:https://github.com/optimatika/ojAlgo/wiki/Getting-Started

关于java - 调试:使用 Java、ojalgo 进行线性代数计算时出现异常运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39578096/

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