4


0

GSL / BLAS:行列に逆行列を掛ける

GNU GSLを使用していくつかのマトリックス計算を行っています。 マトリックスBをマトリックスAの逆数で乗算しようとしています。

これで、GSLのBLAS部分にこれを行う機能がありますが、これはAが三角形の場合のみです。 これには特別な理由がありますか? また、この計算を行う最も速い方法は何でしょうか? LU分解を使用してAを反転する必要がありますか、それともより良い方法がありますか?

FWIW、Aの形式はP ' GPです。Pは正規行列、P’はその逆行列、Gは対角行列です。

本当にありがとう :)

2 Answer


4


Adrienは、BLASが正方行列の逆関数を持たない理由にぴったりだと思います。 逆行列の計算を最適化するために使用している行列に依存します。

通常、LU分解を使用できます。これは、任意の正方行列に有効です。 I. e。、次のようなもの:

gsl_linalg_LU_decomp(A, p, signum);
gsl_linalg_LU_invert(A, p, invA);

ここで、Aはその逆行列が必要な正方行列、pは「gsl_permutation」オブジェクト(順列行列がエンコードされる順列オブジェクト)、signumは順列の符号、invAはAの逆行列です。

「A = P」G Pは「P」法線で「G」対角線であると述べているので、おそらく「A」は法線行列です。 しばらく使用していませんが、それらの因数分解定理が必要です。これは、http://www.gnu.org/software/gsl/manual/html_node/Linear-Algebra.html [ GSLリファレンスマニュアルの第14章]またはそれ以上、線形代数の本で。

単なる例として、対称正定行列があり、その逆行列を見つけたい場合、その種の行列に最適化されたコレスキー分解を使用できます。 次に、GSLで関数 `gsl_linalg_cholesky_decomp()`および `gsl_linalg_cholesky_invert()`を使用して効率的にすることができます。

それが役立つことを願っています!


3


手短に:

三角行列のみがサポートされているという事実は、この操作が三角行列に対して実行するのが非常に簡単であり(逆置換と呼ばれる)、BLASが低レベル関数のルーチンのみを提供するためです。 通常、LAPACKには、ブロック単位の操作に内部的にBLASを使用する高レベルの関数があります。

あなたが扱っている特定の場合: A:= P '* G * P、` P`が正規行列の場合、 A`の逆行列は inv(A):= P' と書くことができます。 inv(G) P`。 その後、2つの選択肢があります。

  1. `inv(A)`をビルドし、 `B`で乗算します。

  2. Bに `inv(A)`のさまざまな係数を順次乗算します。 「B」に「P」(左側)を掛けてから、結果の各行を「G」の対角要素の逆数で再スケーリングしてから、「P」(再び左側)で再び掛けます。

特定のケースに応じて、メソッドを選択できます。 とにかく、倍精度を想定して、 dgemm(行列と行列の乗算、Lvl3 BLAS)と` dscal`(行のスケーリング、Lvl 1 BLAS)が必要です。

お役に立てれば。

A.