2010-12-10 26 views
2

J'essaie de multiplier deux tableaux multidimensionnels pour former une matrice. J'ai cette fonction. Cela devrait fonctionner en théorie. Cependant, je reçois juste des 0 et des numéros grands/maladroits. Quelqu'un peut il m'aider avec ça?Multiplication de deux tableaux en 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

un exemple minimal avec un main() et quelques matrices d'échantillons serait pratique – Spacedman

+1

Pas vraiment lié à votre question, mais au lieu de simplement imprimer "Insuff mem" quand malloc échoue, vous devriez au moins arrêter de faire quoi que ce soit avec le espace non alloué. – buddhabrot

+0

@ user373466, j'ai passé plus de temps que je n'aurais dû. Un vote ou deux et un accord seraient appréciés. – AlastairG

Répondre

2

Effectuez-vous une multiplication matricielle mathématique? Si oui devrait-il pas:

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

Ma solution complète et finale, testé pour produire des résultats sensibles (je ne l'ai pas fait moi-même tous les calculs manuellement pour les vérifier) ​​et sans subtilités sensibles telles que la vérification travail d'allocation de mémoire, est:

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

Il y avait quelques fautes de frappe dans le noyau de la boucle dans ma première réponse, la plupart du temps en raison de mon être induits en erreur par une réponse différente. Ceux-ci ont été corrigés pour la postérité.

+0

Bonne estimation, mais cela n'a pas résolu le problème. Je remarque que ** a et ** b sont NULL. J'ai essayé de les mettre en place, comme je l'ai fait avec ** c, mais ça ne semble pas marcher –

+0

Vous voulez dire '** a == NULL'? NULL = 0 donc tout ce que cela signifie est que 'a [0] [0] == 0'. Alors, que se passe-t-il si l'élément en haut à gauche du tableau est zéro? Si 'a == NULL' alors vous devriez avoir une erreur de segmentation. – AlastairG

+0

Eh bien, quand je mets cet extrait à l'intérieur de ma 3ème boucle. si (a [i] [k] == 0) { \t \t \t \t \t \t \t \t printf ("* A * NULL \ n"); } Il est imprimé. –

0

Si vous changez c[i][j] = (a[i][k]) * (b[k][j]); à c[i][j] += (a[i][k]) * (b[k][j]); dans votre code, alors il fonctionnera très bien à condition que

  • RN1 est le nombre de lignes de la matrice d'une
  • NC1 est le nombre de colonnes de la matrice d'une
  • nc2 est le nombre de colonnes de la matrice b

Assurez-vous simplement que la matrice c est initiée avec des zéros. Vous pouvez simplement utiliser calloc au lieu de malloc lors de l'allocation d'espace, ou memset le tableau alloué après un appel à malloc. Une autre astuce consiste à éviter d'utiliser la lettre l lors de l'accès aux éléments du tableau. quand vous êtes fatigué, vous aurez du mal à remarquer des erreurs avec l vs 1.