【问题标题】:Unexpected result with cblas_dgemvcblas_dgemv 的意外结果
【发布时间】:2015-05-12 15:49:17
【问题描述】:

我有一个关于 cblas_dgemv 的问题。我试图了解它是如何工作的。我可能做错了什么。我有一个数组 Matrix,然后我尝试读取该矩阵 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;
}

【问题讨论】:

    标签: c++ c blas intel-mkl


    【解决方案1】:

    问题出在lda。从参考资料中我们得到了

    lda:矩阵A第一维的大小

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

    矩阵A(nrow,ncol)CblasRowMajor存储是指先存储矩阵A第一行的ncol值,然后存储A第二行的ncol值,以此类推.

    矩阵A(nrow,ncol)CblasColMajor存储是指先存储矩阵A第一列的nrow值,然后存储A第二列的nrow值,以此类推.

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 2012-04-02
      • 2019-05-14
      • 2017-07-11
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多