1

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

我的代码解决了这个问题,但需要很长时间才能完成。因此,我尝试检查 (with System.currentTimeMillis()) 以查看我的代码在哪里变慢。

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

奇怪的是,L1 是一个600x600单位矩阵(即A[i,j] = 1, ifi == j0, else )。所以,这条线不应该花那么长时间来执行。在这个问题中也应该很容易绕过

但是,如果我尝试通过注释掉该行并将其替换为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.

4

1 回答 1

2

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

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

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

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

于 2016-09-20T11:09:38.697 回答