gpt4 book ai didi

Cblas_sgemm 产生错误的结果

转载 作者:行者123 更新时间:2023-11-30 17:05:46 28 4
gpt4 key购买 nike

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

最佳答案

感谢评论中的@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));

因为这些应该是二维矩阵而不是 vector 。

关于Cblas_sgemm 产生错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35095843/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com