cblas_dgemv出乎意料的结果

时间:2015-05-12 15:49:18

标签: c++ c blas intel-mkl

我对cblas_dgemv有疑问。我试图了解它是如何工作的。我可能做错了什么。我有一个数组矩阵,然后我尝试读取矩阵RowMajor和ColumnMajor。

我在RowMajor Case中得到了预期的结果; [6,2,4,6]'。

然而对于ColMajor,我得到[-7,3,0,5]'当答案应该是[6,3,2,3]'

这是我的代码。我使用的是英特尔MKL。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <mkl.h>


#define NCols 5
#define Nrows 4

double A[] = { 8, 4, 7, 3, 5, 1, 1, 3, 2, 1, 2, 3, 2, 0, 1, 1 , 2, 3, 4, 1};

double x[] = { -1, 2, -1, 1, 2 };

double y[Nrows];
double alpha = 1.0, beta = 0.0;
char tbuf[1024];
int main() {
    int i, j;

    // Print original matrix

    // y = Ax
    cblas_dgemv(CblasRowMajor, CblasNoTrans, Nrows, NCols, alpha, A, NCols, x, 1, beta, y, 1);
    // Print resulting vector
    for (j = 0; j < Nrows; j++) {
        printf(" %f\n", y[j]);
    }

    cblas_dgemv(CblasColMajor, CblasNoTrans, Nrows, NCols, alpha, A, NCols, x, 1, beta, y, 1);
    // Print resulting vector
    for (j = 0; j < Nrows; j++) {
        printf(" %f\n", y[j]);
    }

    return 0;
}

1 个答案:

答案 0 :(得分:4)

问题出在lda上。从参考文献中我们得到了

  

lda:矩阵A的第一维的大小

CblasRowMajorCblasColMajor描述二维矩阵的内存存储序列。

矩阵CblasRowMajor的{​​{1}}存储意味着首先存储矩阵A(nrow,ncol)的第一行的ncol值,然后存储A值第二行ncol等等。

矩阵A的{​​{1}}存储意味着首先存储矩阵CblasColMajor的第一列的A(nrow,ncol)值,然后存储nrowA的第二列等等。

因此,在nrow存储中,LDA (矩阵A的第一维)A CblasRowMajor ncol

在您的示例中,您只需更改第二个CblasColMajor

nrow即可
lda