Matrixmultiplikation

javap

Mitglied
Hallo :) Ich bin noch Anfänger was das Programieren betrifft und habe einen Code geschrieben um Matrizen zu multiplizieren, es funktioniert jedoch nicht wie es soll. Ich denke der Fehler liegt in dem Abschnitt , der die Matritzen einlesen soll , aber ich bin mir unsicher ,wie genau ich jetzt denn Code verändern muss.
Schon mal vielen Dank für die Hilfe !

Code:
public class MatrixMult {
  public static void main(String[] args) {
   
    int n = (int) Math.sqrt(args.length);
    int m = (int) Math.sqrt(args.length);

    int [][] a = new int[n][m];
    int [][] b = new int[n][m];
    int [][] c = new int[n][m];
    for (int z=0; z<n; z++) {
     for (int s=0; s<m; s++) {
       a[z][s] = Integer.parseInt(args[z*n+s]);
          }
       }
    for (int z=0; z<n; z++) {
     for (int s=0; s<m; s++) {
       b[z][s] = Integer.parseInt(args[z*n+s]);
        }  
     }
      for (int i= 0; i<n; i++) {
       for (int j = 0; j<n ; j++){
        for (int k =0; k<n ; k++){
          c[i][j] += a[i][k]*b[k][j];
       }  
       System.out.print ( c[i][j]);
   
  }       
}
   
 

  }
}
 

Hellosager

Aktives Mitglied
Probiers mal damit:

Code:
    int n = (int) Math.sqrt(new Integer(args[0]));
    int m = (int) Math.sqrt(new Integer(args[1]));

new Integer(args[0]) übernimmt den ersten eingegeben Parameter als Integerwert.
new Integer(args[1]) macht das gleiche mit der zweiten eingegebenen Zahl

Das was du gemacht hast übergibt der Methode Math.sqrt die Anzahl der eingegeben Zahlen/Parameter als Stringobjekt und versucht aus diesem String dann die Wurzel zu ziehen.
Da du wahrscheinlich immer 2 Zahlen eingegeben hast, wird mit args.length jedes mal "2" geliefert.
Das ansich ist ja schon nicht das was du wolltest, ob du aber mit diesem Stringobjekt überhaupt etwas anfangen könntest weiß ich gerade nicht. Bin mir nicht sicher ob es da einen Autocast von String zu int gibt.
Viel drum rum gelaber, mit dem Code oben sollte es klappen.
 

JStein52

Top Contributor
Das stimmt nicht ! args.length ist die Anzahl der eingegebenen Aufrufparameter !! (und kein String). Und du willst wohl eine quadratische Matrix eingeben. Hat bei deinen Tests denn die Anzahl der Parameter gepasst ? Du überprüfst das nämlich nirgends ! Und was genau passiert ? Exception, falsche Ergebnisse ?

Edit: bei der System.out.printl meldet er dir wahrscheinlich dass j undefiniert ist ?!
 
Zuletzt bearbeitet:

Hellosager

Aktives Mitglied
Da hast du natürlich Recht.
Ich bin mir gerade nicht ganz sicher, wie ich auf ein Stringobjekt gekommen bin, wahrscheinlich dachte ich zwischendurch an Math.sqrt(args[1]), denn das wäre ein String gewesen.
Entschuldigung dafür.
 

javap

Mitglied
Zunächst danke für die Antworten,
Nein j ist ja in der zweiten Schleife schon initialisiert worden, also kompilieren tut es auch. Und ich würde gerne nxm Matrizen einlesen und keine quadratischen
Edit: der Fehler liegt im Ergebnis
 

JStein52

Top Contributor
Ok, habe nochmal genau hingeschaut. Die Einrückung hatte suggeriert das das print ausserhalb der zweiten Schleife steht. Aber wenn du eine nxm-Matrizen haben willst darfst du das mit sqrt(args.length) nicht machen, aber das weisst du sicher. Und wenn die Matrizen nicht quadratisch sind muss die eine nxm sein und die andere mxn ! Und dann stimmen auch die Schleifengrenzen beim multiplizieren nicht ! Aber ich weiss nicht ob das dein Problem ist. Dass das Befüllen mit Werten richtig funktioniert hast du getestet ?

Nur nochmal sicherheitshalber: Solange du das mit dem sqrt(args.length) drin stehen hast produzierst du immer quadratische Matrizen ! Und so wie du das dann mit parseInt befüllst sind sie auch noch beide identisch ! D.h. a und b werden bei dir immer gleich sein ! Und wenn du z.B. 8 Zahlen eingibst wird er 2x2-Matrizen produzieren und die ersten 4 der eingegebenen Zahlen einlesen
 
Zuletzt bearbeitet:

JStein52

Top Contributor
Und nun die gute Nachricht. Du solltest deine Eingabe vielleicht so ändern dass die ersten 3 Zahlen die Dimensionen der Matrizen angeben und die nächsten Zahlen sind dann die Inhalte deiner Matrizen. 3 Zahlen deshalb weil du ja eine nxm-Matrix mit einer mxk-Matrix multiplizieren kannst. Und dann sind die ersten 3 Zahlen eben n, m, k und danach kommen nxm + mxk Zahlen als Inhalt der Matrizen. Und das kannst du auch überprüfen ob die Benutzereingaben passen um Exceptions beim Einlesen zu vermeiden.
 

JStein52

Top Contributor
Den Teil zum einlesen würde ich dann so machen:

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");
        }
        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)]);
            }
        }


}
 

Ähnliche Java Themen

Neue Themen


Oben