Cblas_sgemm产生错误的结果

时间:2016-01-29 23:17:28

标签: c cblas

使用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。

1 个答案:

答案 0 :(得分: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));

因为它们应该是二维矩阵而不是矢量。