実際にdgemm
はサブマトリックスの乗算用に設計されています。各行列と引数の開始ポインタを正しく使用するだけでよい。LDA
、LDB
、LDC
。
BLASのC
変異体である:
A(15x10)
B(10x20)
C(15x20)
:
void cblas_dgemm (const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const double alpha, const double *A, const int lda, const double *B, const int ldb, const double beta, double *C, const int ldc);
は、あなたが行列を持っていると言いますB
の時点(3,5)
から始まるA
Bs(2x5)
の時点(2,1)
から始まる
As(3x2)
:あなたは部分行列を渡すdgemm
を呼び出す必要があるとし cblas_dgemm (CblasColMajor, CblasNoTrans, CblasNoTrans, 15, 20, 10, 1., A, 15, B, 10, 1., C, 15);
を:Column Major
マトリックスストレージ用dgemm
を呼び出す
Cs(3x5)
M
、N
C
の点
(4,2)
始まる、
K
3、5、2に変更しますが、
LDXs
は上記と同じままです。次に、各サブマトリックスの開始点を指すように、
dgemm
への正しいポインタを渡す必要があります。番号が
C
であるため、各座標から1を引く必要があります。
As
出発点はA + (1+0*15)
Bs
出発点はB + (2+4*10)
Cs
出発点はN
LDA
のアイデアは、私は肝炎ということであるC + (3+1*15)
cblas_dgemm (CblasColMajor, CblasNoTrans, CblasNoTrans, 3, 5, 2, 1., A+1, 15, B+42, 10, 1., C+18, 15);
ですされます行列A(LDA,*)
ですが、私は上部サブマトリックスAs(N,*)
を使用します。この例では、上部サブマトリクスを使用するのではなく、内部の別のサブマトリクスを使用したいと考えています。A
。この場合、行列に新しいポインタA+1
を作成します。今すぐAs
はA+1
の上位サブマトリックスです。
同様C
からのFortranのオリジナルdgemm
関数を呼び出すことは
char NoTrans = `N`;
int N = 3;
int M = 5;
int K = 2;
int LDA = 15;
int LDB = 10;
int LDC = 15;
double alpha = 1.0;
double beta = 1.0;
dgemm (&NoTrans, &NoTrans, N, M, K, alpha, A+1, LDA, B+42, LDB, beta, C+18, LDC);
になりありがとうございました。あなたはこのように使うことを意味するものをもう少し説明してください。 blas_dgemmは、各列の行列とサイズの開始を知らないので、サブマトリックスの次の要素をどのように見つけますか? matlabのlapack/blasでこれを使うことができますか?申し訳ありませんが、私はこれに新しいです。 – user85361
@ user85361 'C'に言及したので、私はちょうどcblas相当の言及しました。 mexファイルにもオリジナルのFortranの 'dgemm'を使うことができます。私は答えを更新する – ztik
優れています。どうもありがとうございました。 – user85361