在C中乘以两个数组

时间:2010-12-10 12:02:32

标签: c

我正在尝试将两个多维数组相乘以形成矩阵。我有这个功能。这应该在理论上有效。但是,我只是得到0和大/笨重的数字。有人可以帮我这个吗?

int **matrix_mult( int **a, int **b, int nr1, int nc1, int nc2 )
{
    int **c;
    int i,j,k,l;
    c = malloc(sizeof(int *)*nr1);

    if (c == NULL){
        printf("Insuff memm");
    }

    for(l=0;l<nr1;l++){
        c[l] = malloc(sizeof(int)*nc1);
        if (c[l] == NULL){
            printf("Insuff memm");
        }

    }//for loop


    for (i=0;i<nr1;i++){
        for (j=0;j<nc2;j++){
            for (k=0;k<nc1;k++){

                c[i][j] = (a[i][k]) * (b[k][j]);
    }
    }
    }
        return( c );  
    }

2 个答案:

答案 0 :(得分:2)

你在做数学矩阵乘法吗?如果不是这样的话:

for(i = 0; i < nr1; i++)
{
    for(j = 0; j < nc1; j++)
    {
        c[i][k] = 0;

        for(k = 0; k < nc2; k++)
        {
            c[i][k] += (a[i][j]) * (b[j][k]);
        }
    }
}

我的完整和最终解决方案,经过测试以产生合理的结果(我实际上并没有自己手动完成所有计算以检查它们)并且没有任何明智的细节,例如检查内存分配工作,是:

int **matrix_mult(int **a, int **b, int nr1, int nc1, int nc2)
{
    int **c;
    int i, j, k;

    c = malloc(sizeof(int *) * nr1);

    for (i = 0; i < nr1; i++)
    {
        c[i] = malloc(sizeof(int) * nc2);

        for (k = 0; k < nc2; k++)
        {
            c[i][k] = 0;

            for (j = 0; j < nc1; j++)
            {
                c[i][k] += (a[i][j]) * (b[j][k]);
            }
        }
    }

    return c;
}

在我的原始答案中,for循环的核心中有一些拼写错误,主要是由于我被一个不同的答案误导。这些已被后人纠正。

答案 1 :(得分:0)

如果您在代码中将c[i][j] = (a[i][k]) * (b[k][j]);更改为c[i][j] += (a[i][k]) * (b[k][j]);,那么只要

可以正常工作
  • nr1是矩阵a的行数
  • nc1是矩阵a
  • 的列数
  • nc2是矩阵b的列数

确保矩阵c以零启动。你可以在分配空间时使用calloc而不是malloc,或者在调用malloc之后memset分配的数组。

另一个提示是在访问数组元素时避免使用字母l。累了的时候,你会很难注意到l vs 1的错误。