Multiplikation zweier Matrizen

kantolyo123

Mitglied
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 class Matrix12 {



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++) {













System.out.print(ergebnismatrix[j] + "\t");

}



}}



}
 
Das mußt du nochmal posten in
Code:
[code=JAVA]Programmcode
[/code]

da
Code:
[i]
rekursiv wird, weil die Forensoftware dazu zu dämlich ist.
 
public class Matrix12 {

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++) {






System.out.print(ergebnismatrix[j] + "\t");
}

}}

}
 
Java:
public class Matrix12 {
           
            public static void main(String[] args) {
                //1.Matrix
                int z1 = Integer.parseInt(args[0]);
                int s1 = Integer.parseInt(args[1]);
                int[][] matrix1 = new int [z1][s1];
                for(int i = 0; i < matrix1.length; i++) {
                    for(int j = 0; j < matrix1[i].length; j++) {
                        matrix1[i][j] = (int)(z1*s1);
                    }
                }
                        //2.Matrix
                        int z2 = Integer.parseInt(args[2]);
                        int s2 = Integer.parseInt(args[3]);
                        int[][] matrix2 = new int [z2][s2];
                        for(int i = 0; i < matrix2.length; i++) {
                            for(int j = 0; j < matrix2[i].length; j++) {
                                matrix2[i][j] = (int)(z2*s2);
                            }
                        }
                    //Multiplikation
                       
                        int[][] ergebnismatrix = new int[z1][s1];
                        for(int i = 0; i < z1; i++) {
                            for(int j = 0; j < s1; j++) {
                                for(int k = 0; k < z1; k++)
                                    ergebnismatrix[i][j] += matrix1[i][k] * matrix2[k][j];
                                   
                               
                            }}
                       
                       
                        //Ausgabe der ergebnismatrix
                        for(int i = 0; i < z1; i++) {
                            for(int j = 0; j < s1; j++) {
                               
                System.out.print(ergebnismatrix[i][j] + "\t");
                        }
               
        }}

    }
 
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
 
Das Format des Ergebnisses pass bei einer Matrix Multiplikation nicht:
(z1 x s1) * (z2 x s2) ist (z1 x s2)

Java:
if(s1 != z2) {
  System.out.println("Falsches Format");
} else {
int[][] ergebnismatrix =newint[z1][s2];
  for(int i =0; i < z1; i++){
    for(int j =0; j < s2; j++){
      for(int k =0; k < s1; k++) {
        ergebnismatrix[i][j]+= matrix1[i][k]* matrix2[k][j];
}
 
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:
Java:
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++]);
  }
}
Analog für die zweite Matrix
 
Code:
//1.Matrix
                int pos = 0;
                int z1 = Integer.parseInt(args[pos++]);
                int s1 = Integer.parseInt(args[pos++]);
                int[][] matrix1 = new int [z1][s1];
               
                for(int y=0;y<z1;y++) {
                    for(int x=0;x<s1;x++) {
                        matrix1[y][x] = Integer.parseInt(args[pos++]);
                       
                    }
                    }
                }
            //2.Matrix
            int pos1 = 0;
            int z2 = Integer.parseInt(args[pos++]);
            int s2 = Integer.parseInt(args[pos1++]);
            int[][] matrix2 = new int [z2][s2];
}
            for(int y=0;y<z2;y++) {
                for(int x=0;x<s2;x++) {
                    matrix2[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
 
Code:
public static void main(String[] args) {
                //1.Matrix
                int pos = 0;
                int z1 = Integer.parseInt(args[pos++]);
                int s1 = Integer.parseInt(args[pos++]);
                int[][] matrix1 = new int [z1][s1];
               
                for(int y=0;y<z1;y++) {
                    for(int x=0;x<s1;x++) {
                        matrix1[y][x] = Integer.parseInt(args[pos++]);
                       
                    }
                    }
                }
            //2.Matrix
            int pos1 = 0;
            int z2 = Integer.parseInt(args[pos++]);
            int s2 = Integer.parseInt(args[pos1++]);
            int[][] matrix2 = new int [z2][s2];{

            for(int y=0;y<z2;y++) {
                for(int x=0;x<s2;x++) {
                    matrix2[y][x] = Integer.parseInt(args[pos++]);
                }
            }
            }
}
 
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.
    }
}
 

Zurück
Oben