2010-12-10 86 views
2

我想将两个多维数组相乘以形成一个矩阵。我有这个功能。这应该在理论上起作用。但是,我只是得到0和大/笨拙的数字。有人可以帮我弄这个吗?在C中乘以两个数组

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); 
    } 
+0

一个main()和一些示例矩阵的最小示例将得心应手 – Spacedman 2010-12-10 12:12:20

+1

与您的问题并不真正相关,但是当malloc失败时,您不应该仅仅打印“Insuff mem”,您应该至少停止使用未分配的空间。 – buddhabrot 2010-12-10 12:22:36

+0

@ user373466,我已经花了更多的时间在这方面比我应该有。一票或两票和接受将不胜感激。 – AlastairG 2010-12-10 14:27:19

回答

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; 
} 

有几个错别字的在我原来的答复为核心的循环,主要是因为我被一个不同的答案误导。这些已被后人纠正。

+0

不错的猜测,但它并没有解决问题。我注意到** a和** b是NULL。我试图malloc他们,就像我用** c做的,但它似乎没有工作 – 2010-12-10 12:40:13

+0

错误你的意思是** ** == NULL? NULL = 0,所以这意味着'a [0] [0] == 0'。那么如果数组左上角的元素为零呢?如果'a == NULL',那么你应该得到一个分段错误。 – AlastairG 2010-12-10 12:46:41

+0

那么,当我把这个片段放入我的3rd for循环中。 如果(A [1] [k]的== 0){ \t \t \t \t \t \t \t \t的printf( “* A * NULL \ n”); }它打印出来。 – 2010-12-10 12:54:29

0

如果你在你的代码更改c[i][j] = (a[i][k]) * (b[k][j]);c[i][j] += (a[i][k]) * (b[k][j]);那么它会工作得很好,只要

  • NR1是矩阵
  • NC1的行数是矩阵
  • 的列数
  • nc2是矩阵b的列数

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

还有一个技巧是在访问数组元素时避免使用字母l。当累了的时候,你会很难注意到l1之间的错误。