1

MY 最後の質問はあまり明確ではありませんでした。というわけで再投稿。BLAS ルーチン dgemm を使用して行列乗算を実行しようとしています。dgemmに入力したい配列のサイズが固定されていないので、可変サイズの配列を作成しています。しかし、例外エラーが発生し続けるため、これは機能していないようです。私のコードは以下の通りです:

#include "stdafx.h"
#include<iostream>

using namespace std;

extern "C" void dgemm_(const char *TRANSA, const char *TRANSB, const int *M, const int *N, const int *K, double *ALPHA, double **A, const int *LDA, double **B, const int *LDB, double *BETA, double **C, const int *LDC);

int main(void)
{
    int MatSize = 2;
    double **A= new double *[MatSize];
    double **B= new double *[MatSize]; 
    double **C= new double *[MatSize];
    for (int i=0; i<MatSize; i++)
    {
        A[i] = new double[MatSize];
        B[i] = new double[MatSize];
        C[i] = new double[MatSize];
    }
    A[0][0] =  1;
    A[0][1]= 2;
    A[1][0] = 1;
    A[1][1]=2;
    B[0][0] = -2;
    B[0][1]= 3;
    B[1][0]= 2;
    B[1][1]= 2;
    char TRANS = 'N';
    char TRANS2 = 'N';
    double ALPHA = 1;
    double BETA = 0;
    dgemm_(&TRANS, &TRANS, &MatSize, &MatSize, &MatSize, &ALPHA, A, &MatSize, B, &MatSize, &BETA, C, &MatSize);
    cout << C[0][0] << C[0][1] << endl;
    cout << C[1][0] << C[1][1] << endl;
    getchar();
    return 0;
}

任意の入力は非常に役立ちます。

4

1 に答える 1

3

配列の配列、つまり (配列への) ポインターの配列を dgemm に渡そうとします。もちろん、それは不可能です。double の配列を渡す必要があります。

dgemm ヘッダーについてはこちらを参照してください。double** ではなく、double* が必要です。

于 2013-04-17T05:48:23.810 に答える