cblas_dgemv 出现意外结果

opt*_*ode 4 c c++ blas intel-mkl

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

我在 RowMajor 案例中得到了预期的结果;[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;
}
Run Code Online (Sandbox Code Playgroud)

zti*_*tik 6

问题出在lda. 从参考文献中我们得知

lda:矩阵A第一维的大小

CblasRowMajor描述CblasColMajor了二维矩阵的内存存储顺序。

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

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

因此,在存储中,CblasRowMajorLDA (矩阵 A 的第一维)是.ncolCblasColMajornrow

在你的例子中你只需要改变lda第二个cblas_dgemv

cblas_dgemv(CblasColMajor, CblasNoTrans, Nrows, NCols, alpha, A, Nrows, x, 1, beta, y, 1);
Run Code Online (Sandbox Code Playgroud)