sgemm
Pythonで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 番目のケースでパラメータを渡すと、何が問題になっていますか?
ヘルプ、リンク、記事、アドバイスをいただければ幸いです。