Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich bin gerade dabei ein Programm zu programmieren, das zwei Matrizen multiplizieren soll. Mein Problem ist nur, dass ein völlig falsches Ergebnis rauskommt. Hat jemand einen Tipp für mich? Wäre echt super. Hier mein bisheriges Vorgehen:
public static void main(String[] args) {
//Definition der 1.Matrix
int z1 = Integer.parseInt(args[0]);
int s1 = Integer.parseInt(args[1]);
int[][] matrix1 = new int [z1][s1];
//Füllen der 1.Matrix
for(int i = 0; i < matrix1.length; i++) {
for(int j = 0; j < matrix1.length; j++) {
matrix1[j] = (int)(z1*s1);
}
}
//Definition der 2.Matrix
int z2 = Integer.parseInt(args[2]);
int s2 = Integer.parseInt(args[3]);
int[][] matrix2 = new int [z2][s2];
//Füllen der 2.Matrix
for(int i = 0; i < matrix2.length; i++) {
for(int j = 0; j < matrix2.length; j++) {
matrix2[j] = (int)(z2*s2);
}
}
//Multiplikation der beiden Matrizen
int[][] ergebnismatrix = new int[z1][s1];
for(int i = 0; i < z1; i++) {
for(int j = 0; j < s1; j++) {
//Formt die neue Matrix
for(int p = 0; p < z1; p++)
ergebnismatrix[j] += matrix1[p] * matrix2[p][j];
}}
//Ausgabe der ergebnismatrix
for(int i = 0; i < z1; i++) {
for(int j = 0; j < s1; j++) {
sieht doch schon viel besser aus^^
jetzt wäre es noch gut, wenn du schreibst was denn rauskommen sollte und was tatsächlich rauskommt.
Was gibst du dem Programm denn für Parameter mit?
Eine Sache fällt mir direkt auf, du setzt jedes einzelne Feld deiner ersten Matrix auf den wert z1*s1
und bei der zweiten matrix auf z2*s2. Ist das gewollt? oder sollen die Matrizen mit den weiteren Startparametern gefüllt werden?
Ansonsten solltest du noch deine Ausgabe anpassen. Bisher schreibst du nämlich alles in eine Zeile
Java:
for(int i =0; i < z1; i++){
for(int j =0; j < s1; j++){
System.out.print(ergebnismatrix[i][j]+"\t");
}
System.out.println();
}
Danke für deine Antwort. Ich übergebe dem Programm einen Wert z1 für die Zeilenzahl der ersten Matrix, s1 für die Spaltenzahl, dann folgen die Werte der Matrix und dann das gleiche mit der zweiten Matrix. Es soll alles in einer Zeile auf der Konsole eingegeben werden, also zum Beispiel für die Matrix
2 4
5 6
folgt die Eingabe 2 2 2 4 5 6
Die Bezeichnungen z1 und z2 bzw. s1 und s2 habe ich gewählt, um die Matrizen auseinander halten zu können
du liest die matrix halt nicht richtig ein.
bei der eingabe 2 2 2 4 5 6
erzeugst du eine matrix der größe 2*2 (korrekt) und setzt jeden einzelnen wert darin auf 2*2
=>
4 4
4 4
Die zweite Matrix hat dann die größe 2*4 und wird mit dem wert 2*4 gefüllt.
Du benutzt halt IMMER die ersten vier parameter als matrix dimensionen:
int z1 = Integer.parseInt(args[0]);
int s1 = Integer.parseInt(args[1]);
int[][] matrix1 = new int [z1][s1];
// ...
int z2 = Integer.parseInt(args[2]);
int s2 = Integer.parseInt(args[3]);
die ersten beiden parameter einlesen und als dimension der ersten Matrix zu nutzen ist korrekt.
Danach solltest du aber die Matrix auch erstmal richtig befüllen und nicht einfach alle Einträge auf z1*s1 setzen.
Eine simple Lösung wäre diese hier:
Java:
int pos = 0; // position innerhalb deines parameter arrays
int z1 = Integer.parseInt(args[pos++]); // args[pos] holen und danach pos um eins erhöhen
int s1 = Integer.parseInt(args[pos++]);
int[][] matrix1 = new int[z1][s1];
for(int y=0;y<z1;y++) { // zeilen durchgehen
for(int x=0;x<s1;x++) { // spalten durchgehen
matrix1[y][x] = Integer.parseInt(args[pos++]);
}
}
du hast da irgendwie deine Klammern durcheinander gebracht. geh deinen code einfach mal durch und korrigiere die Klammern.
Tipp: bei der ersten Matrix öffnest du zwei Klammern, schließt danach aber drei...
ganz offensichtlich sind sie noch nicht ganz in Ordnung.
Allein in dem obigen Code befindet sich noch eine weitere Klammer die einfach zu geht, ohne vorher geöffnet worden zu sein.
Rück deinen Code einfach mal ordentlich ein, dann sieht man sofort wo Klammer fehler sind
sogar der Klammerfehler den ich eben genannt habe ist dort noch vorhanden...zweimal sogar
Ich will jetzt nicht gemein klingen, aber ein bisschen Eigeninitiative musst du schon erbringen. Und Klammerfehler zu korrigieren ist jetzt nicht unbedingt eine komplexe angelegenheit
Vorschlag: Die ersten drei Aufrufparameter geben die Dimensionen der beiden Matrizen an die du multiplizieren willst. Denn du kannst nur eine mxn mit einer nxk - Matrix multiplizieren. Mit diesen werten
kannst du dann deine Eingabematrizen und die Ergebnismatrix dimensionieren (die ist dann nämlich mxk).
Und die nächsten Parameter sind dann die Inhalte der Matrizen. Etwa so:
Java:
public class MatrixMult {
public static void main(String[] args) {
if (args.length < 3) {
System.out.println("Falsche Anzahl von Parametern");
return;
}
int n = Integer.parseInt(args[0]);
int m = Integer.parseInt(args[1]);
int k = Integer.parseInt(args[2]);
int[][] a = new int[n][m];
int[][] b = new int[m][k];
int[][] c = new int[n][k];
if (args.length < (3 + n * m + m * k)) {
System.out.println("Falsche Anzahl von Parametern");
return;
}
for (int z = 0; z < n; z++) {
for (int s = 0; s < m; s++) {
a[z][s] = Integer.parseInt(args[3 + (z * n + s)]);
}
}
for (int z = 0; z < m; z++) {
for (int s = 0; s < k; s++) {
b[z][s] = Integer.parseInt(args[3 + (n * m) + (z * n + s)]);
}
}
// hier kommt jetzt die Multiplikation hin du du ja im Prinzip schon hattest.
}
}