2010-12-10 6 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

минимальный пример с основными() и некоторыми матрицами образцов был бы полезен – Spacedman 2010-12-10 12:12:20

+1

Не имеет отношения к вашему вопросу, но вместо того, чтобы просто печатать «Insuff mem», когда malloc терпит неудачу, вы должны по крайней мере прекратить делать что-либо с помощью незанятое пространство. – buddhabrot 2010-12-10 12:22:36

ответ

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

Если изменить c[i][j] = (a[i][k]) * (b[k][j]); к c[i][j] += (a[i][k]) * (b[k][j]); в вашем коде, тогда он будет работать нормально при условии, что

  • nr1 это число строк матрицы а
  • НС1 число столбцов матрицы а
  • nc2 - количество столбцов матрицы b

Просто убедитесь, что матрица c инициирована нулями. Вы можете просто использовать calloc вместо malloc при распределении пространства или memset выделенного массива после вызова malloc.

Еще один совет - избегать использования буквы l при доступе к элементам массива. когда вы устали, вам будет сложно заметить ошибки с l против 1.

Смежные вопросы