Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言将两个数组相乘_C - Fatal编程技术网

用C语言将两个数组相乘

用C语言将两个数组相乘,c,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");

我试图将两个多维数组相乘,形成一个矩阵。我有这个功能。这在理论上应该是可行的。然而,我只是得到了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 );  
    }
int**matrix\u mult(int**a,int**b,int nr1,int nc1,int nc2)
{
int**c;
int i,j,k,l;
c=malloc(sizeof(int*)*nr1);
如果(c==NULL){
printf(“inuff memm”);
}

对于(l=0;l你在做数学矩阵乘法吗?如果是这样,它不应该是:

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]);
        }
    }
}
(i=0;i { 对于(j=0;j
我的完整和最终解决方案经过测试,能够产生合理的结果(我并没有亲自手动进行所有计算来检查它们),并且没有任何合理的细节,例如检查内存分配工作,它是:

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;
}
int**matrix\u mult(int**a,int**b,int nr1,int nc1,int nc2)
{
int**c;
int i,j,k;
c=malloc(sizeof(int*)*nr1);
对于(i=0;i

在我最初的答案中,for循环的核心部分有一些拼写错误,主要是因为我被不同的答案误导了。这些错误已经为后代纠正了。

如果你在你的代码中更改
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

的错误。一个带有main()和一些示例矩阵的最小示例与您的问题没有真正的关系,而不仅仅是打印“inuff mem”当malloc失败时,您至少应该停止使用未分配的空间做任何事情。@user373466,我在这方面花的时间比我应该花的时间多。请投一两票并接受。当代码明显被破坏时,“这在理论上应该行得通。”这是一个大胆的说法!你是说你的代码是对的,编译器坏了吗?这不是最有可能的解释。猜得好,但它并没有解决问题。我注意到**a和**b是空的。我试图对它们进行malloc处理,就像我对**c所做的那样,但它似乎不起作用。你的意思是
**a==NULL
?NULL=0等等意思是
a[0][0]==0
。那么,如果数组的左上角元素为零呢?如果
a==NULL
,那么你应该得到一个分段错误。好吧,当我把这个片段放在我的第三个for循环中时。if(a[I][k]==0){printf(“a NULL\n”);}它被打印出来了。你的第一个数组有零元素吗?如果没有,我会很惊讶的!我刚刚更新了c+=a*b行,因为它是错误的。我从Buddhabrot复制的,他弄错了。