1

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

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 に答える