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

  • Mod

    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...


Anmelden zum Antworten