2016-01-29 81 views
0

我有一个使用cblas的sgemm函数的问题。Cblas_sgemm产生错误的结果

下面是代码:

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

#define MATRIX_DIM 5 

int main(){ 

    float *a_mat = calloc(MATRIX_DIM*MATRIX_DIM, sizeof(float)); 
    float *b_mat = calloc(MATRIX_DIM, sizeof(float)); 
    float *c_mat = calloc(MATRIX_DIM, sizeof(float)); 
    int i,j; 

    for(i=0; i<MATRIX_DIM*MATRIX_DIM; i++) { 
     a_mat[i] = 1.0f; 
     b_mat[i] = 1.0f; 
     c_mat[i] = 0.0f; 
    } 

    cblas_sgemm(CblasRowMajor, CblasNoTrans, 
       CblasNoTrans, MATRIX_DIM, MATRIX_DIM, 
       MATRIX_DIM, 1.0, a_mat, 
       MATRIX_DIM, b_mat, MATRIX_DIM, 
       1.0, c_mat, MATRIX_DIM); 

    //RESULT PRINTING 
    printf("Printing A MATRIX: \n"); 
    for(i=0; i<MATRIX_DIM; i++) { 
     for(j=0; j<MATRIX_DIM; j++){ 
       printf("%0.1f ", a_mat[i*MATRIX_DIM+j]); 
     } 
     printf("\n"); 
    } 
    printf("Printing B MATRIX: \n"); 
    for(i=0; i<MATRIX_DIM; i++) { 
      for(j=0; j<MATRIX_DIM; j++){ 
       printf("%0.1f ", b_mat[i*MATRIX_DIM+j]); 
     } 
     printf("\n"); 
    } 

    printf("\nPrinting the Results: \n"); 
    for(i=0; i<MATRIX_DIM;i++){ 
     for(j=0; j<MATRIX_DIM; j++){ 
       printf("%0.1f ", c_mat[i*MATRIX_DIM+j]); 
     } 
     printf("\n"); 
    } 

    free(a_mat); 
    free(b_mat); 
    free(c_mat); 

    return 0; 
} 

我相当一些我把是错误的观点,但我真的不知道是哪个。结果应该是填充5.0的5x5矩阵。相反,程序与此回应:

6.0 6.0 6.0 16.0 86.0 
6.0 6.0 6.0 16.0 86.0 
16.0 36.0 6.0 46.0 86.0 
16.0 36.0 5.0 45.0 85.0 
20.0 80.0 5.0 45.0 85.0 

我知道rowmajor订单或转置参数可能是错误的,以后我会弄清楚的,但是在这个特殊的乘法答案应该是5.0两种方式。

+0

嗯...你不应该为'sizeof(float)'调用''calloc'吗? sizeof(* a_mat)'甚至有效吗?而且你的结果不应该是长度为5的*向量*,所有元素等于5?并且不应该将结果写入矢量*'c_mat'中?你怎么没有得到任何segfaults? –

+0

@AndrasDeak好吧,你可能对'sizeof(float)'部分是正确的,但由于某种原因,它的工作原理就好了。不过,我会改变它。由于它是矩阵 - 矩阵乘法,所以结果应该是M×N的矩阵(M是第一个矩阵的行,N是第二个矩阵的列),在这种情况下它将是一个5×5矩阵。我想你是指矩阵向量乘法。 – kmentis

+0

我在哪里可以看到第二个矩阵有5列? 'float * b_mat = calloc(MATRIX_DIM,sizeof(* b_mat));'只是分配的一列值。因此,我惊讶的是,你稍后不会收到段错误。一种可能性就是'sizeof(* a_mat)'(不管那是什么)比'float'有更大的空间。而你的问题正是它*不*工作正常:) –

回答

0

感谢@AndrasDeak的评论,我所需要的只是在两个矩阵上分配更多的空间,这是我之前忽略的。

所以基本上改变:

float *b_mat = calloc(MATRIX_DIM, sizeof(float)); 
float *c_mat = calloc(MATRIX_DIM, sizeof(float)); 

到:

float *b_mat = calloc(MATRIX_DIM*MATRIX_DIM, sizeof(float)); 
float *c_mat = calloc(MATRIX_DIM*MATRIX_DIM, sizeof(float)); 

由于这些都应该是2维矩阵,而不是载体。

+0

我仍然会将这些sizeof()函数更改为float :)因为这实际上是代码中的一个错字,所以您应该考虑未来的用户是否可以找到有用的Q&A。如果你*不这么认为,那么可能值得删除这个问题。如果你决定继续问答,那么在你能够(24或48小时,我认为)之后接受你的答案 –

+0

我改变了'calloc'浮动像你说的,我应该改变' * MATRIX_DIM'部分以及它充分发挥功能?我是新的stackoverflow,所以我不熟悉这个过程。 – kmentis

+0

Ooooh no no no,sorry,you misunderstood :)我的意思是改变你的实际代码,但不是你上面的问题(你的回答并不清楚你是否也改变了'sizeof',这就是为什么我也注意到了这一点我的评论)。程序是“保持原样,除非增加澄清”,并且任何修补程序都应该回答。然后,所有事情都只出现一次:一个明确的问题陈述和一个(或更多)明确的答案。 –

相关问题