2016-01-29 109 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',這就是爲什麼我也注意到了這一點我的評論)。程序是「保持原樣,除非增加澄清」,並且任何修補程序都應該回答。然後,所有事情都只出現一次:一個明確的問題陳述和一個(或更多)明確的答案。 –

相關問題