C Multiplikation zweier Matrizen resultiert in erster Matrize

Woodz

Lieutenant
Registriert
Apr. 2009
Beiträge
689
Hallo.


Ich bin langsam am verzweifeln.

Ich habe eine 178 x178 Matrize, aus der ich deren Inverse berechnet habe. Um das Ergebnis zu testen möchte ich die Inverse wieder mit der Ursprungsmatrize multiplizieren um eine Einheitsmatrix zu erhalten.

Ich habe die Ursprungsmatrize und deren Inverse in Excel kopiert und sie miteinander multiplizieren lassen. Ergebnis ist die gewünschten Einheitsmatrix. D.h. die Rechnung ist wohl richtig.

Das Problem ist nur, wenn ich die beiden Matrizen in C multipliziere, erhalte ich als Ergebnis wieder die Inverse und nicht die Einheitsmatrix. An diesem Punkt komme ich nicht mehr weiter. Was ist das Problem?
Da es sich um eine quadratische Matrize handelt, hab ich in der Funktion auf eine Zeilen/Spalten-Prüfung verzichtet.

Input:
MatrizeA (Auszug von Indizes 0,0 bis 2,2):
1.1231.5982.434
1.5981.123-11.403
2.434-11.4031.123

MatrizeB (Auszug von Indizes 0,0 bis 2,2):
-1.974-0.615-0.275
-0.615-0.038-0.052
-0.275-0.0520.048

Ergebnis (Auszug von Indizes 0,0 bis 2,2):
-1.974-0.615-0.275
-0.615-0.038-0.052
-0.275-0.0520.048
-> Das Ergebnis kann doch nicht wieder die Inverse sein



C:
multiplyMatrix(matrixA,
               matrixB,
               rows,
               cols);

void multiplyMatrix(double **matrixA, double **matrixB, int rows, int cols){

    int idx, jdx, kdx;

    double **matrixP;

    matrixP = (double **) calloc(rows, sizeof(double *));
    if (matrixP == NULL){

        printf("Speicherfehler!\n");

    }

    else{
        for (idx=0; idx<rows; idx++){
         
            matrixP[idx] = (double *) calloc(cols, sizeof(double));

            if (matrixP[idx] == NULL){
                printf("Speicherfehler!\n");
            }
        }

        // Multiplikation:

        for (idx=0; idx<rows; idx++){

            for (jdx=0; jdx<cols; jdx++){

                matrixP[idx][jdx] = 0;

                for (kdx=0; kdx<cols; kdx++){

                    matrixP[idx][jdx] += (matrixA[idx][kdx] * matrixB[kdx][jdx]);
                }
            }
        }
       
       show_matrix(matrixP, 3, 3);

        for (idx=0; idx<rows; idx++){

            free(matrixP[idx]);

        }
        free(matrixP);
    }
}

void show_matrix(double **matrix, int rows, int cols){

    int idx, jdx;

    for (idx=0; idx<rows; idx++){
    
        for (jdx=0; jdx<cols; jdx++){
        
            printf("%8.3f", matrix[idx][jdx]);   
        
        }
      
        printf("\n");
    }
    printf("\n");
}

Ich habe auch schon mehrfach die Input-Matrizen geprüft. Es handelt sich definitiv um die zwei gewünschten Matrizen. Ich habe auch deren Speicheradressen geprüft. Auch diese unterscheiden sich. Es wird also nicht die Inverse als Resultat ausgegeben.
 
Zuletzt bearbeitet:
Edit: War eher Blödsinn.
 
Zuletzt bearbeitet:
Neenee. Das müsste schon so alles stimmen.
In Zeile 12 reserviere ich einen Doppelzeiger vom Typ "double" für einen Vektor von Zeigern der Länge "rows".
Deshalb auch **matrixP, da ich einen Doppelzeiger reverviere, sprich eine 2D Matrix und nicht nur einen Vektor.
Aber egal. Die Speicherreservierung für eine 178x178 Matrix ist ok. Ich frage mich nur, warum am Ende die Werte der Inversen Matrix in der Produktmatrix stehen?
 
Wo/wie genau lässt du dir das überhaupt ausgeben? Du returnst nichts, printest aber auch nichts.
 
Ja, sorry. Ich möchte nicht den kompletten Code posten, da es mir zu viel Zeit kostet ihn auf das Nötigste zu beschränken, damit er einfach lesbar ist. Ich habe meine Frage um die Ausgabe der Matrizen ergänzt.
 
Meine Vermutung war jetzt, dass du irgendwie die falsche Adresse an die Ausgabe gibst. So, wie es in deinem Beispiel aussieht, ist das nicht der Fall.
 
Ist der Algorithmus für die Multiplikation murks? Ich habe das Ganze noch einmal an einem Trivialbeispiel für eine 3x3 Matrix getestet. Auch hier liefert er mir die Inverse als Ergebnis, während mir ein Onlinerechner tatsächlich die Einheitsmatrix liefert.
 
Irgendwas ist da definitiv krumm. Du bildet ja
Rl x m x Rm x n -> Rl x n
ab, hast aber nur zwei length-Parameter. Müsste bei quadratischen Matrizen aber egal sein.
 
Ok. Ich hab den Fehler gefunden!
Das Problem ist, dass ich beim Berechnen der Inversen, die Ursprungsmatrix ändere. Das ist halt das Problem, wenn man mit Zeigern arbeitet und nicht mit Kopien.

Ich danke trotzdem fuer die Hilfe.

Beste Grüße.
 
  • Gefällt mir
Reaktionen: kuddlmuddl und mtono8
Zurück
Oben