2012-03-20 50 views
1

我试图用vecLibs' cblas相乘两个矩阵:vecLib cblas_sgemm文档错误?

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 

#include <vecLib/cblas.h> 

int main (void) { 

    float *A = malloc(sizeof(float) * 2 * 3); 
    float *B = malloc(sizeof(float) * 3 * 1); 
    float *C = malloc(sizeof(float) * 2 * 1); 

    cblas_sgemm(CblasRowMajor, 
       CblasNoTrans, 
       CblasNoTrans, 
       2, 
       1, 
       3, 
       1.0, 
       A, 2, 
       B, 3, 
       0.0, 
       C, 2); 

    printf ("[ %f, %f]\n", C[0], C[1]); 

    return 0; 
} 

按照docs每个说法似乎符合但我得到这个错误:

lda must be >= MAX(K,1): lda=2 K=3BLAS error: Parameter number 9 passed to cblas_sgemm had an invalid value

回答

4

您所看到的错误似乎对我的眼睛完全正确。

LDA始终是线性内存中阵列A的间距。如果您使用行主要存储顺序,则间距将是列数,而不是行数。所以在这种情况下,LDA应该是3。

+0

该文档说'lda 矩阵A的第一维的大小;如果你传递一个矩阵A [m] [n],那么这个值应该是m,但这个m是矩阵行的数量。 – Pedro 2012-03-20 18:37:56

+1

文档说的是正确的 - lda是线性内存*中矩阵A *的第一维。冒号后面的内容适用于列主要订单的情况。 – talonmies 2012-03-20 18:44:46