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

时间:2012-10-22 13:29:35

标签: c segmentation-fault matrix-multiplication gsl

我使用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;
}

3 个答案:

答案 0 :(得分:3)

当您执行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

答案 1 :(得分:1)

您没有检查malloc()返回值,因此我的猜测是一个或多个分配失败并且您取消引用NULL。另一种可能性当然是索引错误,因此你可以超越界限。

答案 2 :(得分:1)

您错误地计算了所有矩阵的元素索引。

当您将MxN矩阵分配为1维数组时,元素(i,j)的索引为i*N+j。相反,您将其计算为i*M+j