3

sgemmPythonでctypesを使用してBLASで関数を利用しようとしています。C = A x Bを解こうとすると、次のコードは問題なく動作します。

no_trans = c_char("n")
m = c_int(number_of_rows_of_A)
n = c_int(number_of_columns_of_B)
k = c_int(number_of_columns_of_A)
one = c_float(1.0)
zero = c_float(0.0)

blaslib.sgemm_(byref(no_trans), byref(no_trans), byref(m), byref(n), byref(k),
               byref(one), A, byref(m), B, byref(k), byref(zero), C, byref(m))

ここで、この方程式を解きたいと思います: C = A' x Aここで、A'はAの転置であり、次のコードは例外なく実行されますが、返される結果は間違っています。

trans = c_char("t")
no_trans = c_char("n")
m = c_int(number_of_rows_of_A)
n = c_int(number_of_columns_of_A)
one = c_float(1.0)
zero = c_float(0.0)

blaslib.sgemm_(byref(trans), byref(no_trans), byref(n), byref(n), byref(m),
               byref(one), A, byref(m), A, byref(m), byref(zero), C, byref(n))

テストのために、行列A = [1 2;を挿入しました。3 4] . 正しい結果はC = [10 14; です。14 20]しかし、ルーチンはC = [5 11;sgemmを吐き出します。11 25] .

私が理解している限り、アルゴリズムがそれを処理するため、行列Aを転置する必要はありません。2 番目のケースでパラメータを渡すと、何が問題になっていますか?

ヘルプ、リンク、記事、アドバイスをいただければ幸いです。

4

2 に答える 2

6

Blas は通常、(Fortran のような) 列優先の行列を使用するためA = [1 2; 3 4]

    |1 3|   
A = |   |
    |2 4|

結果は正しいです (Python ライブラリが同じことを行うと仮定します)。このリードミーを参照してください

于 2011-04-18T16:19:02.190 に答える
1

あなたが示しsgemmた結果は、A'*A ではなく A*A' を計算したことを示しています。簡単な解決策は、2 つの入力を関数に切り替えることです。

于 2011-04-18T16:10:19.003 に答える