1

関数 cblas_cgemm(); を使用して、行列から行列への乗算を実行しようとしました。しかし、私が得ている答えは、手計算と比べて正しくありません。入力に虚数を使用せずにコードを単純化しようとしましたが、問題は残ります。正しい出力を得るには、どのような変更を加える必要がありますか。これは私のコードです。

#include<stdio.h>
#include<math.h>
#include<complex.h>
#include "cblas.h"

void main()
{
 int i,j;
 double complex A[2][2]={1,2,
                         3,4};
 double complex B[2][2]={4,5,
                         6,7};
 double complex W[2][2]={0,0,
                         0,0};

 const int m1=2;
 const int n1=2;
 const int k1=2;

 const int lda1=2;
 const int ldb1=2;
 const int ldc1=2;
 const double alpha=1.0;
 const double beta=0.0;

 cblas_cgemm(CblasRowMajor,CblasNoTrans,CblasNoTrans,m1,n1,k1,&alpha,A,lda1,B, ldb1 ,&beta,W, ldc1);

 for(i=0;i<m1;++i)
  {
  for(j=0;j<n1;++j)
    printf("%lf %lf\n" ,creal(W[i][j]),cimag(W[i][j]));
  printf("\n");
   }
 }

次のように出力されました

-119296.000000 0.000000
-188416.000000 0.000000 0.000000 0.000000
0.000000 0.000000
このサイトを参照しましたlapack:cblas_cgemm 助けてください cblas_dgemm() を使用した私のコードを以下に示します

//Y := alpha*A*X + beta*Y, or   y := alpha*A**T*x + beta*y,
#include<stdio.h>
#include "cblas.h"
const double A[3][1]={
                      1,
                      2,
                      3
                       };
const double X[1][4]={
1,2,3,4,
};
double Y[3][4]={
0,0,0,0,
0,0,0,0,
0,0,0,0
};
int main()
{
 const int m=3;
const int k=1;const int n=4;
const int lda=1;
const int ldb=4;
const int ldc=4;
int incX,incY;
const double alpha=1.0;
const double beta=0.0;
incX=1;incY=1;
int i,j;
for(i=0;i<m;++i)
   {for(j=0;j<k;++j)
    printf("%lf \t" ,A[i][j]);
putchar('\n');
}
cblas_dgemm(CblasRowMajor,CblasNoTrans,CblasNoTrans,m,n,k,alpha,A, lda,X, ldb ,beta,Y, ldc);
for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
printf("%lf\t" ,Y[i][j]);
printf("\n");
}
return 0;
}

次のように出力されました

HP@hp-hp-notebook:〜/beamforming/programs/sustedprojectdetails $ ./dgemm_trial 1.000000
2.000000
3.000000.000000.000000.000000.0000006.0000008880000 3.000000.0000


4

2 に答える 2