2013-04-05 88 views
3

我对C++相当陌生,并且尝试将LAPACK库用于矩阵乘法。 我试着运行下面给出的例程dgemm。我期待输出A * B。但每次我得到答案B * A。它是常规工作的方式,或者我的代码有问题。LAPACK与C++的矩阵乘法

我的代码:

#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) 
{ 
    double A[4] = {1,2,3,4}; 
    double B[4] = {5,6,7,8}; 
    char TRANS = 'N'; 
    int M = 2; 
    int N = 2; 
    int K = 2; 
    double ALPHA = 1.0; 
    int LDA = 2; 
    int LDB = 2; 
    double BETA = 0.0; 
    double C[4]; 
    int LDC = 2; 

    dgemm_(&TRANS, &TRANS, &M, &N, &K, &ALPHA, A, &LDA, B, &LDB, &BETA, C, &LDC); 

    cout << C[0] << endl; 
    cout << C[1] << endl; 
    cout << C[2] << endl; 
    cout << C[3] << endl; 
    getchar(); 
    return 0; 
} 

任何投入将是非常有益的。

+2

听起来像col col major vs row主要困惑 – 2013-04-05 10:34:44

+0

@David Heffernan我也怀疑这一点。非常感谢你的投入。你可以添加它作为答案? – Tushar 2013-04-08 08:57:11

+0

DGEMM是BLAS功能,而不是LAPACK。 – 2014-06-05 15:32:40

回答

2

我还没有研究你对dgemm调用的细节,我也不知道你是如何解释结果矩阵的。但是,你似乎很可能在某处混合了主要和主要的解释。最有可能的是计算使用col major,但是你假定行主要。

+0

根据你的输入,我在最近几天研究了一些细节。 dgemm是基于Fortran的BLAS例程。因此,专栏专业对行专业的问题是一个确定的原因。 – Tushar 2013-04-09 03:45:36