Programm zur Matrizenmultiplikation.
-
Moin moin C++forenleser!
Ich hänge derzeit an einer Aufgabe und stehe damit komplett auf dem Schlauch.
Es funktioniert erstmal soweit alles wie ich es möchte, nur bei der Ausgabe kommt immer 0 0 raus.
Würde mich sehr freuen wenn mir wer auf die Sprünge helfen könntet.Grüße!
#include <stdio.h> #include <stdlib.h> int main(void){ unsigned int m,n,k,i,j,sum = 0; printf(" Please enter a positiv integer:\n m = ");scanf(" %d",&m); printf(" Please enter a positiv integer:\n n = ");scanf(" %d",&n); printf(" Please enter a positiv integer:\n k = ");scanf(" %d",&k); float A[m][n]; float B[n][k]; float C[m][k]; for(i=0;i<m;i++){ for(j=0;j<n;j++){ printf("A_%u,%u = ",i+1,j+1); scanf("%f",&(A[i][j])); } } for(i=0;i<n;i++){ for(j=0;j<k;j++){ printf("B_%u,%u = ",i+1,j+1); scanf("%f",&(B[i][j])); } } for ( i = 0 ; i < m ; i++ ){ for ( j = 0 ; j < k ; j++ ){ for ( k = 0 ; k < n ; k++ ){ sum = sum + A[m][n]*B[n][k]; } C[m][k] = sum; sum = 0; } } printf("Das Produkt der eingegebenen Matrizen:\n"); for ( i = 0 ; i < m ; i++ ) { for ( j = 0 ; j < k ; j++ ) printf("%f\t", C[m][k]); printf("\n"); } return 0; }
-
In Zeile 27 willst du sicherlich irgendwie i, j und k benutzen, anstatt m und n. Ebenso bei allen anderen Gelegenheiten, bei denen du auf deine Felder zugreifst (Zeilen 29 und 36). Außerdem machst du komische Sachen mit deinem k (Zeilen 25 und 26). Das kommt davon, wenn man allen Variablen bloß einbuchstabige Bezeichner verpasst, die überhaupt nichts mit deren Funktion zu tun haben.
-
Ok danke, ich schau mir die Zeilen nochmal an.
Und ich bin leider erst seit kurzem beim Programmieren, nehme mit den Tipp mit den einbuchstabigen Variablen aber zu Herzen.
-
habe das Programm jetzt umgeschrieben. Funktioniere tut es jetzt für eine 2x2 Matrix, aber für eine 3x3 geht er bei Matrix B nicht wieder auf 0 zurück.
#include <stdio.h> int main (void) { unsigned int h,i,j,k,m,n; printf("Matrix A, rows m = "); scanf("%u",&m); printf("Matrix A, columns n = "); scanf("%u",&n); float A[m][n]; // A is a matrix with m rows and n columns. // Read the matrix A from the keyboard. for(i=0;i<m;i++){ // A i: 1...m --> Zeilenindex for(j=0;j<n;j++){ // A j: 1...n -->Spaltenindex printf("A_%u,%u = ",i+1,j+1); scanf("%f",&(A[i][j])); } } printf("\nMatrix B, rows = n (In order to execute matrix multiplication) \n\nMatrix B, columns k = "); scanf("%u",&k); float B[n][k]; // B is a matrix with n rows and k columns. // Read the matrix B from the keyboard. for(j=0;j<n;j++){ // B j: 1...n -->Zeilenindex for(h=0;h<k;h++){ // B h: 1...k -->Spaltenindex printf("B_%u,%u = ",j+1,h+1); scanf("%f",&(B[j][h])); } } // Compute the matrice product A*B=C float C[m][k]; // Randbedingungen der Indizes für die Multiplikation for(h=0;h<k;h++){ for(i=0;i<m;i++){ for(j=0;j<n;j++){ C[i][h]+=A[i][j]*B[j][h]; // Compute the matrix entry C = A*B. } } } printf("Product of the two matrices A*B = C is \n"); for (i=0; i<m; i++){ for (h=0; h<k; h++) printf("%f\t",C[i][h]); printf("\n"); } return 0; }
-
Krosh schrieb:
habe das Programm jetzt umgeschrieben.
Hast du eine andere Quelle gefunden?
Krosh schrieb:
Funktioniere tut es jetzt für eine 2x2 Matrix, aber für eine 3x3 geht er bei Matrix B nicht wieder auf 0 zurück.
Was meinst du mit dem letzten Teil von dem Satz?
Da wir deine Testwerte nicht kennen, können wir das nicht nachvollziehen.Lass dir mal die Matrix C vor der Berechnung ausgeben.
Gibt dein Compiler auch Warnungen aus?
Zeile 37 ist falsch eingerückt.
-
Moin,
nein meine Quelle ist ein Skript.
Mein Problem war das die Zahlen die ich in die 2. Matrix eingegeben habe, falschen Orten zugwieen wurde, beginnend mit 4_1, 4_2 usw. Das habe ich aber rausbekommen.
Neine eine Warnung bekomme ich nicht.
Ich teste immer mit einer zwei 3x3 Matrizen. A= 1,2,...,9, B = 9,8,...,1.
Leider werden a11, a12, a13, a21 nicht richtig angezeigt. a22 - a33 jedoch schon.
-
Tipp: lass dir mal die Werte von 'float C[m][k];' noch vor der Multiplikationsschleife ausgeben...