Ax = b
解決したい適度に大きな問題があります。マトリックス A は600x600
です。
私のコードは問題を解決しますが、そうするのに非常に長い時間がかかります。System.currentTimeMillis()
そこで、コードがどこで遅くなるかを(で) チェックしようとし ました。
A の計算中に、コマンド を実行することがわかりましたA = L1 * A0 * L1.transpose()
。プロセスは、この行で合計時間のほぼ 100% を消費します。
奇妙なことに、L1 は600x600
単位行列です (つまりA[i,j] = 1
、 の場合i == j
と0
の場合)。したがって、この行の実行にはそれほど時間がかかりません。この問題では簡単にバイパスできるはずです
ただし、その行をコメントアウトして に置き換えてバイパスしようとすると、さらに奇妙なことが起こりA = A0
ます。次に、コードの実行に時間がかかりすぎます(元の時間を10倍にした後)。また、CPU 使用率が 100% に達します。
確認したところ、A
とL1 * 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
。