cblas_dgemv 的意外结果
Unexpected result with cblas_dgemv
我有一个关于 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;
}
问题在 lda
。从参考文献中我们得到
lda: The size of the first dimension of matrix A
CblasRowMajor
和CblasColMajor
描述了二维矩阵的内存存储顺序
矩阵A(nrow,ncol)
的CblasRowMajor
存储是指先存储矩阵A
第一行的ncol
值,然后ncol
] 第二行的值 A
等等。
矩阵A(nrow,ncol)
的CblasColMajor
存储是指先存储矩阵A
第一列的nrow
值,然后nrow
] A
第二列的值等等。
所以在 CblasRowMajor
存储中 LDA (矩阵 A 的第一维) 是 ncol
而在 CblasColMajor
中 nrow
.
在您的示例中,您只需更改第二个 cblas_dgemv
的 lda
cblas_dgemv(CblasColMajor, CblasNoTrans, Nrows, NCols, alpha, A, Nrows, x, 1, beta, y, 1);
我有一个关于 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;
}
问题在 lda
。从参考文献中我们得到
lda: The size of the first dimension of matrix A
CblasRowMajor
和CblasColMajor
描述了二维矩阵的内存存储顺序
矩阵A(nrow,ncol)
的CblasRowMajor
存储是指先存储矩阵A
第一行的ncol
值,然后ncol
] 第二行的值 A
等等。
矩阵A(nrow,ncol)
的CblasColMajor
存储是指先存储矩阵A
第一列的nrow
值,然后nrow
] A
第二列的值等等。
所以在 CblasRowMajor
存储中 LDA (矩阵 A 的第一维) 是 ncol
而在 CblasColMajor
中 nrow
.
在您的示例中,您只需更改第二个 cblas_dgemv
lda
cblas_dgemv(CblasColMajor, CblasNoTrans, Nrows, NCols, alpha, A, Nrows, x, 1, beta, y, 1);