cblas_dgemv出乎意料的结果

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

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

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

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

#include  #include  #include  #include  #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; } 

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

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

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

矩阵A(nrow,ncol)CblasRowMajor存储意味着首先存储矩阵A的第一行的ncol值,然后存储A的第二行的ncol值,依此类推。

矩阵A(nrow,ncol)CblasColMajor存储意味着首先存储矩阵A的第一列的nrow值,然后存储A的第二列的nrow值,依此类推。

所以在CblasRowMajor存储中,LDA (矩阵A的第一维)CblasColMajor ,而在CblasColMajornrow

在您的示例中,您只需要更改第二个cblas_dgemv lda

 cblas_dgemv(CblasColMajor, CblasNoTrans, Nrows, NCols, alpha, A, Nrows, x, 1, beta, y, 1);