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