2 つの行列をAlgLibで乗算するにはどうすればよいですか
3 に答える
免責事項: 私は AlgLib を使用していません。ドキュメントに書かれているように見えることに従っているだけです。どなたか詳しい方に訂正していただけると幸いです。
とにかく、答えは、次のようにcmatrixgemm
or rmatrixgemm
(行列が実数か複素数かによって異なります) を使用する必要があるようです。
rmatrixgemm(m,n,k, 1, A,0,0,0, B,0,0,0, 0, C,0,0);
どこ:
m
,n
,k
は行列のサイズです (A
ism
byk
,B
isk
byn
,C
ism
byn
)- the
1
は積に掛ける値です (たまたま AB ではなく 3AB が必要な場合は、3
そこに置きます) A,0,0,0
およびグループは次のB,0,0,0
とおりです: 行列、行オフセット、列オフセット、演算タイプ- 演算の種類は、AやBをそのまま使う場合は0、転置を使う場合は1、共役転置を使う場合は2です(もちろん に2を使うことはできません
rmatrixgemm
) 。
- 演算の種類は、AやBをそのまま使う場合は0、転置を使う場合は1、共役転置を使う場合は2です(もちろん に2を使うことはできません
- 次
0
は、結果に 0*C を追加することを示しています (ここに 0 を入力すると、C の初期値は完全に無視されます)。 - C の後の 2 つ
0
の s は、行と列のオフセットです
おそらく、そのレベルの一般性は過剰であり、これらのデフォルトを提供するより単純な関数が必要であると考えるかもしれません。私はそれに同意しませんが、私が見る限り、AlgLib にはこれほど単純な関数はありません。独自に記述したい場合があります (rmatrixgemm
またはを呼び出すだけcmatrixgemm
です)。
(なぜそんなに一般的なのでしょうか? 効率的な行列乗算を行うには非常に洗練されたコードが必要であり、それは本質的に、より一般的なC=a.f(A).g(B)+b.C
操作を行うために必要な非常に洗練されたコードと同じ*matrixgemm
であり、より一般的な操作が役立つ場合があるためです。)
役に立つかもしれないいくつかの発言を追加するために編集されました。
- オフセットは、部分行列で処理できるようにするためのものです。これを実行できることは、一部の数値アルゴリズムで役立ちます。
m
、n
、使用しているサブマトリックスk
のサイズです。一般的なケースでは、それらは配列の次元と同じになり、オフセットはゼロになります。 rmatrixgemm
またはを呼び出す前に、配列自体が存在し、適切なサイズである必要がありますcmatrixgemm
。少なくとも、A
そしてB
確かにそうです。C
として渡されるため、エントリref
にある場合、これらの関数がそれを作成する可能性があります。null
rmatrixgemm
orの署名から考えると、 は参照によって渡されるのにコピーされるかもしれませんが、Ccmatrixgemm
#のセマンティクスについて完全に混乱していなければ、それらはすべて実質的に (オブジェクト) 参照によって渡されます。A
B
C
ガレスが書いたことを確認するためだけに:
double[,] a = new double[,] {
{1,2,3},
{4,5,6}
};
double[,] b = new double[,] {
{7,8,9,10},
{11,12,13,14},
{15,16,17,18}
};
int m = a.GetLength(0);
int n = b.GetLength(1);
int k = a.GetLength(1);
double[,] c = new double[m,n];
alglib.rmatrixgemm(m, n, k, 1, a, 0,0,0, b,0,0,0, 0, ref c, 0,0);
//c = {{74, 80, 86, 92}, {173, 188, 203, 218}}
vba では、この関数の複雑なバージョンを使用できました。
Alpha.x = 1: Alpha.y = 0
Beta.x = 0: Beta.y = 0
Call CMatrixGEMM(4, 1, 4, Alpha, r, 0, 0, 0, x, 0, 0, 0, Beta, RX, 0, 0)
補足として、すべてのalglibモジュールを1つのアクセスデータベースにロードし、関数が必要な現在のデータベースからそのデータベースへの参照を設定することにより、alglib関数のセット全体を任意のアクセスプログラムにロードできます。これにより、作業データベースにとって非常に便利で軽量になります。