Matrizenmultiplikation ( mal wieder )



  • Heyho,
    Ich stehe gerade vor dem Problem das ich gerne 2 von Hand eingegebene Matrizen miteinander multiplizieren würde und diese dann als Ergebnismatrix ausgeben mag.

    Also mal abgesehen das mein Code vermutlich totales Chaos beinhaltet hoffe ich jemand hier kann mal drüber gucken.
    Ich würde gerne das Problem beheben bevor ich es nochmal "neu" code und auf die Form achte :S..

    Problem: Die Ergebnismatrix wird ausgegeben mit lauter 0en belegt. Also wird der Fehler wohl in der Matrixmultiplikation liegen 😃 ich komme gerade aber einfach nicht drauf. Wäre für einen Tipp sehr dankbar, muss ja nichtmal die Lösung sein 🙂

    #include <stdio.h>
    
    int main()
    {
    	//Init Schleifenvariablen
    	int count1,count2,count3;
    	//Init Zeilen-&Spaltenvariablen der Matrizen
    	int ZeilenA,ZeilenB, SpaltenA,SpaltenB;
    	//Init Matrizencounter
    	int matrix_count=0;
    
    //Bestimmung der  Matrizengrößen
    	printf("Geben sie die Anzahl der Zeilen fuer Matrix 1 ein: ");
    	scanf("%d",&ZeilenA);
    	printf("Geben sie die Anzahl der Spalten fuer Matrix 1 ein: ");
    	scanf("%d",&SpaltenA);
    	printf("Geben sie die Anzahl der Zeilen fuer Matrix 2 ein: ");
    	scanf("%d",&ZeilenB);
    	printf("Geben sie die Anzahl der Spalten fuer Matrix 2 ein: ");
    	scanf("%d",&SpaltenB);
    
    	double matrix1[ZeilenA][SpaltenA];
    	double matrix2[ZeilenB][SpaltenB];
    
    	if(SpaltenA!=ZeilenB) printf("\nERROR, Matrizenmultiplikation nicht möglich");
    	else
    	{
    
    // Bereitstellung  von Matrix 1 und Matrix 2
    // Matrix 1 Werte einlesen und abspeichern
    		matrix_count++;
    		printf("\n");
    		printf("Matrix 1 befuellen: \n\n");
    		for(count1=0;count1<ZeilenA;count1++) //Zeilen M1
    		{
    			for(count2=0;count2<SpaltenA;count2++) //Spalten M1
    			{
    				printf("Wert fuer Matrix %i[%d][%d]:  ",matrix_count,count1,count2);
    				scanf("%d",&matrix1[count1][count2]);
    			}
    		}
    
    // Matrix 2 werte einlesen und abspeichern			
    		++matrix_count;
    		printf("\n");
    		printf("Matrix 2 befuellen: \n\n");
    		for(count1=0;count1<ZeilenB;count1++) //Zeilen M2
    		{
    			for(count2=0;count2<SpaltenB;count2++) //Spalten M2
    			{
    				printf("Wert fuer Matrix %i[%d][%d]:  ",matrix_count,count1,count2);
    				scanf("%d",&matrix2[count1][count2]);
    			}
    		}	
    
    // Ausgabe der beiden Matrizen	
    // Matrix 1 Ausgabe
    	--matrix_count;
    	printf("\nAusgabe von Matrix %i[%d][%d]...\n\n",matrix_count,ZeilenA,SpaltenA); 
    	for(count1=0;count1<ZeilenA;count1++) //Zeilen M1
    		{
    			for(count2=0;count2<SpaltenA;count2++) //Spalten M1
    			{
    				printf("\t%4d ",matrix1[count1][count2]);	
    			}
    			printf("\n\n");
    
    		}
    
    // Matrix 2 Ausgabe 
    	++matrix_count;
    	printf("\nAusgabe von Matrix %i[%d][%d]...\n\n",matrix_count,ZeilenB,SpaltenB); 
    	for(count1=0;count1<ZeilenB;count1++) //Zeilen M2
    		{
    			for(count2=0;count2<SpaltenB;count2++) //Spalten M2
    			{
    				printf("\t%4d ",matrix2[count1][count2]);	
    			}
    			printf("\n\n");
    
    		}
    
    // Matrizenmultipliktion matrix1 * Matrix2
    //Init Ergebnismatrix
    	int ZeilenC,SpaltenC,res_tmp=0;
    	double matrix3[ZeilenC][SpaltenC];
    
    	//Matrix3 berechnen
    	 for(count1=0;count1<ZeilenA;count1++)
    	 {
    	 	for(count2=0;count2<SpaltenA;count2++)
    	 	{
    		//	res_tmp=0;
    	 		for(count3=0;count3<SpaltenB;count3++)
    	 		{
    	 			res_tmp = res_tmp + ((matrix1[count1][count3] * matrix2[count3][count2]));
    	 			SpaltenC =count3+1;
    	 			matrix3[count2][count1] = res_tmp;
    	 		}
    	 	}
    	 	//res_tmp = 0;
    	 	ZeilenC = count1+1;
    	 }
    
    //Ausgabe Ergebnismatrix
    	printf("\n\n");
    	matrix_count++;
    	printf("Ausgabe von Matrix %i[%d][%d]: \n\n",matrix_count,ZeilenC,SpaltenC);
    	for(count1=0;count1<ZeilenC;count1++)
    	{
    		for(count2=0;count2<SpaltenC;count2++)
    		{
    			printf("\t%4d ",matrix3[count1][count2]);
    		}
    	printf("\n\n");
    	}	
    
    return 0;
    }
    }
    

    Grüße



  • Was der Compiler dazu sagt:

    .\main.c||In function 'main':|
    .\main.c|40|warning: format '%d' expects argument of type 'int *', but argument 2 has type 'double *' [-Wformat]|
    .\main.c|53|warning: format '%d' expects argument of type 'int *', but argument 2 has type 'double *' [-Wformat]|
    .\main.c|65|warning: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Wformat]|
    .\main.c|78|warning: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Wformat]|
    .\main.c|120|warning: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Wformat]|
    .\main.c|127|warning: control reaches end of non-void function [-Wreturn-type]|
    .\main.c|88|warning: 'SpaltenC' may be used uninitialized in this function [-Wuninitialized]|
    .\main.c|88|warning: 'ZeilenC' may be used uninitialized in this function [-Wuninitialized]|
    ||=== Build finished: 0 errors, 8 warnings (0 minutes, 1 seconds) ===|
    

    Das %d bei scanf (und auch bei printf) steht nicht für double sondern für dezimal integer.
    Für double gibt es andere Specifier (die sind bei scanf und printf unterschiedlich)

    Und wofür brauchst du SpaltenC und ZeilenC? Und welchen Wert haben die in Zeile 88?
    Wie groß wird jetzt matrix3 sein?

    Du änderst in der Schleife (nach der Definition von matrix3) die Werte von SpaltenC und ZeilenC.
    Hoffst du, das sich matrix3 dydnamisch anpasst?
    In C können Arrays nach ihrer Definition nicht mehr in der Größe und Speicheradresse geändert werden. Das ist statisch.

    Zudem greifst du in Zeile 103 nur mit den Zeilen- und Spaltenindex von A auf matrix 3 zu. Das geht auch in die Hose.



  • Du solltest dir echt überlegen, ob es nicht besser ist, die Sache mit dem Programmieren zu lassen. So langsam habe ich es satt, den dummen Nichtakademikern immer aus der Patsche helfen zu müssen.



  • DirkB schrieb:

    Du solltest dir echt überlegen, ob es nicht besser ist, die Sache mit dem Programmieren zu lassen. So langsam habe ich es satt, den dummen Nichtakademikern immer aus der Patsche helfen zu müssen.

    Hallo Namensvetter. 🙂



  • Hallo,

    Warum sollte er es mit dem Programmieren lassen, jeder hat mal klein angefangen und hatte viele Schwierigkeiten. Vorallem die Multiplikation mit Matrizen ist ein nicht so einfaches Thema. Ich finde er hat schon einen guten Ansatz.

    Grüsse
    Richard


Anmelden zum Antworten