2010-12-10 15 views
2

Ich versuche, zwei multidimensionale Arrays zu einer Matrix zu multiplizieren. Ich habe diese Funktion. Dies sollte theoretisch funktionieren. Allerdings bekomme ich nur Nullen und große/peinliche Zahlen. Kann mir jemand dabei helfen?Multiplikation zweier Arrays in 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

ein minimales Beispiel mit einer main() und einigen Beispielmatrizen wäre praktisch – Spacedman

+1

Nicht wirklich mit Ihrer Frage verbunden, aber statt nur "Insuff mem" drucken, wenn malloc fehlschlägt, sollten Sie zumindest etwas mit dem tun nicht zugeordneten Speicherplatz. – buddhabrot

+0

@ user373466, ich habe mehr Zeit damit verbracht, als ich hätte. Eine Stimme oder zwei und ein Akzeptieren würden geschätzt. – AlastairG

Antwort

2

Machst du mathematische Matrixmultiplikation? Wenn dies der Fall sollte es nicht sein:

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

Meine vollständige und endgültige Lösung getestet, um sinnvolle Ergebnisse zu produzieren (ich habe nicht wirklich alles tun, die Berechnungen selbst manuell zu überprüfen) und ohne vernünftige Nettigkeiten wie etwa die Überprüfung Speicherzuordnungen Arbeit ist:

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

Es gibt ein paar Tippfehler im Kern der in meiner ursprünglichen Antwort für Schleife waren, vor allem aufgrund meiner durch eine andere Antwort verleiten wird. Diese wurden für die Nachwelt korrigiert.

+0

Gut geraten, aber es hat das Problem nicht gelöst. Ich bemerke, dass ** a und ** b NULL sind. Ich habe versucht, sie zu malloc, wie ich mit ** c getan habe, aber es scheint nicht zu funktionieren –

+0

Err du meinst '** a == NULL'? NULL = 0 also heißt das nur 'a [0] [0] == 0'. Was ist, wenn das obere linke Element des Arrays Null ist? Wenn 'a == NULL', sollten Sie einen Segmentierungsfehler erhalten. – AlastairG

+0

Nun, wenn ich dieses Snippet in meine 3rd for Schleife stecke. wenn (a [i] [k] == 0) { \t \t \t \t \t \t \t \t printf ("* A * NULL \ n"); } Es wird gedruckt. –

0

Wenn Sie c[i][j] = (a[i][k]) * (b[k][j]); zu c[i][j] += (a[i][k]) * (b[k][j]); in Ihrem Code ändern dann wird es funktionieren ganz gut vorausgesetzt, dass

  • nr1 ist die Anzahl der Zeilen der Matrix eine
  • NC1 ist die Anzahl der Spalten der Matrix eine
  • nc2 ist die Anzahl der Spalten der Matrix b

Stellen Sie sicher, dass die Matrix c mit Nullen eingeleitet wird. Sie können Calloc anstelle von malloc verwenden, wenn Sie Speicherplatz zuweisen, oder das zugewiesene Array nach einem Aufruf von malloc in memset speichern.

Noch ein Tipp ist, den Buchstaben l beim Zugriff auf Array-Elemente zu vermeiden. Wenn Sie müde sind, werden Sie Schwierigkeiten haben, Fehler mit l vs 1 zu bemerken.

Verwandte Themen