我使用gsl随机生成器生成2个大矩阵,并使用gsl cblas将它们相乘,但是当cblas操作开始时我总是遇到Segmentation故障。当我无法解决这个问题时,我会编写下面的代码,使用非常基本的思想来进行矩阵乘法,我仍然会得到分段错误,但是当矩阵真的很小时,所有这两个都可以正常工作,我'我真的对此感到困惑。
#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;
}
答案 0 :(得分:3)
当您执行i*m+j
时,不应该是i*l+j
吗?同样,i*m+k
应为i*l+k
,k*n+j
应为k*l+j
原因是,例如E = (float*)malloc(sizeof(float)*(m*l))
,因此您有m
行和l
列(反之亦然),所以如果您正在迭代m
您需要将m
迭代器(在本例中为i
)乘以该维度中矩阵的步幅,即l
。
答案 1 :(得分:1)
您没有检查malloc()
返回值,因此我的猜测是一个或多个分配失败并且您取消引用NULL
。另一种可能性当然是索引错误,因此你可以超越界限。
答案 2 :(得分:1)
您错误地计算了所有矩阵的元素索引。
当您将MxN
矩阵分配为1维数组时,元素(i,j)
的索引为i*N+j
。相反,您将其计算为i*M+j
。