gpt4 book ai didi

c - 进行矩阵乘法时 C 中的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:43 25 4
gpt4 key购买 nike

我使用 gsl 随机生成器生成 2 个大矩阵,并使用 gsl cblas 将它们相乘,但是当 cblas 操作开始时我总是出现 Segmentation fault。当我无法解决这个问题时,我就写了下面的代码,使用最基本的思想进行矩阵乘法,我仍然得到了Segmentation Fault,但是当矩阵真的很小的时候两者都可以正常工作,我'我对此感到非常困惑。

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#define PI 3.1415926

void GenerateKey(int m, int n, int l, int q, float alpha)
{
// initialization
int i;
int j;
int k;

float *A;
float *S;
float *E;
float *B;

float sigma = (alpha * q ) / sqrt(2 * PI);
A=(float*)malloc(sizeof(float)*(m*n));
S=(float*)malloc(sizeof(float)*(n*l));
B=(float*)malloc(sizeof(float)*(m*l));
E=(float*)malloc(sizeof(float)*(m*l));

// init A
for(i = 0; i < m*n; i++)
{
A[i]=0;
}
printf("\n");

// init S
for(i = 0; i < n*l; i++)
{
S[i]=0;
}

printf("\n");

// init E
for(i = 0; i < m*l; i++)
{
E[i]=0;
}

printf("\n");
float po;
for(i = 0; i < m; i++)
{
for(j=0; j<l; j++)
{
po=0;
for(k=0; k<n; k++)
{
po +=A[i*m+k]*S[k*n+j];
}
po += E[i*m +j];
B[i*m+j]=((int)po) % q;
}
}

printf("Game over");

printf("\n");
free(A);
free(B);
free(S);
free(E);
}

int main()
{
GenerateKey(2680,191,64,72973,0.000551);

return 0;
}

最佳答案

当你在做 i*m+j 时,不应该是 i*l+j 吗?同样,i*m+k 应该是 i*l+kk*n+j 应该是 k*l+ j

原因是,以 E = (float*)malloc(sizeof(float)*(m*l)) 为例,所以你有 m 行和l 列(反之亦然),因此如果您在 m 维度上迭代,您需要乘以您的 m 迭代器( i 在这种情况下)由矩阵在该维度中的步长,即 l

关于c - 进行矩阵乘法时 C 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13012513/

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