大きなブロックの対角疎行列の逆行列を計算したいと思います。行と列の数は 50,000 をやや超えています。ブロックは 12 x 12 で、まばらです (27 個の非ゼロ要素)。
行列全体の逆数を計算しようとしました (ソルブを使用)。これは不可能でした。マトリックス全体が大きすぎます。
その後、for ループを使用します。各反復内で、1 つのブロックを取り出し、その逆数を計算して元に戻します。
その方法は機能しますが、約5分かかります。もっと速い方法があるのだろうか。
よろしくお願いします。
大きなブロックの対角疎行列の逆行列を計算したいと思います。行と列の数は 50,000 をやや超えています。ブロックは 12 x 12 で、まばらです (27 個の非ゼロ要素)。
行列全体の逆数を計算しようとしました (ソルブを使用)。これは不可能でした。マトリックス全体が大きすぎます。
その後、for ループを使用します。各反復内で、1 つのブロックを取り出し、その逆数を計算して元に戻します。
その方法は機能しますが、約5分かかります。もっと速い方法があるのだろうか。
よろしくお願いします。
私は次のようにして、コードではるかに高速に作成しました。
1) ブロック対角行列の逆行列を大きな行列に戻すのではなく、リストに格納します。最後に、bdiag() コマンドを使用して、リストからマトリックス全体を作成しました。2) ブロック対角行列を 1 つずつではなく、10 個程度のグループで考えることで、10 個のブロック対角行列からなる部分行列の逆行列を繰り返し計算します。
元の質問では、各ブロックの逆数を取るだけでなく、各ブロックに何らかの変換も適用したとは言いませんでした。これで、ブロック対角行列全体に対して事前に変換が行われるため、時間も節約されます。