2

CBLAS を使用して外積を実行するのに問題があります。私のコードは次のとおりです。

//===SET UP===//
double x1[] = {1,2,3,4};
double x2[] = {1,2,3};
int dx1 = 4;
int dx2 = 3;
double X[dx1 * dx2];
for (int i = 0; i < (dx1*dx2); i++) {X[i] = 0.0;}

//===DO THE OUTER PRODUCT===//
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasTrans, dx1, dx2, 1, 1.0, x1, dx1, x2, 1, 0.0, X, dx1);

//===PRINT THE RESULTS===//
printf("\nMatrix X (%d x %d) = x1 (*) x2 is:\n", dx1, dx2);
for (i=0; i<4; i++) {
    for (j=0; j<3; j++) {
        printf ("%lf ", X[j+i*3]);
    }
    printf ("\n");
}

私は得る:

Matrix X (4 x 3) = x1 (*) x2 is:
1.000000 2.000000 3.000000 
0.000000 -1.000000 -2.000000 
-3.000000 0.000000 7.000000 
14.000000 21.000000 0.000000 

しかし、正しい答えはここにあります: https://www.sharcnet.ca/help/index.php/BLAS_and_CBLAS_Usage_and_Examples

私は見ました: C でのクロネッカー積の効率的な計算

しかし、実際にこれを行うためにdgemmを利用する方法を実際に言っていないので、私には役に立ちません...

何か助けはありますか?ここで何が間違っていますか?

4

2 に答える 2

8

dgemm を使用して行うこともできますが、外積専用の実装である dger を使用する方がスタイル的には正しいでしょう。そのため、正しく使用する方がいくらか簡単です。

cblas_dger(CblasRowMajor, /* you’re using row-major storage */
           dx1,           /* the matrix X has dx1 rows ...  */
           dx2,           /*  ... and dx2 columns.          */
           1.0,           /* scale factor to apply to x1x2' */
           x1,
           1,             /* stride between elements of x1. */
           x2,
           1,             /* stride between elements of x2. */
           X,
           dx2);          /* leading dimension of matrix X. */

dgemmには、渡す\beta = 0と結果行列が初期化されるという優れた機能があり、呼び出しの前に自分で明示的にゼロにする必要がなくなります。@Artem Shinkarov の回答は、dgemm の使用方法の優れた説明を提供します。

于 2013-11-08T03:49:25.577 に答える