Matrix Klasse mit Mehrdimensionalen Array (Addition, Multiplikation, to String)

zDieTaschenlampe

Aktives Mitglied
Hallo,
wie ihr dem Titel entnehmen könnt gehts um Mehrdimensionale Arrays in der Anwendung für s Arbeiten mit Matrizen. Mein aktueller Stand ist das :

Code:
public class MathMatrix {

    int[][] matrix;

    public MathMatrix(int[][] matrix) {
        this.matrix = matrix;
    }
  
    Die folgende Methode hat funktioniert, aber ich hab die Aufgabe nicht gründlich gelesen -.-
    /*public int[][] add(int[][] firstMatrix, int[][] secondMatrix) {
        matrix = new int[firstMatrix.length][firstMatrix[0].length];

        for (int i = 0; i < firstMatrix.length; i++) {
            for (int j = 0; j < firstMatrix[i].length; j++) {
                matrix[i][j] = firstMatrix[i][j] + secondMatrix[i][j];

            }
        }
        return matrix;
    }*/
  
    // diese add methode weiß ich nicht, ob sie klappt
    public void add(int[][] secondMatrix) {
        matrix = new int[matrix.length][matrix[0].length];

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                matrix[i][j] = matrix[i][j] + secondMatrix[i][j];
              

            }
        }
        //return matrix;
    }
  
    // ebenso nicht getestet, da mir die toString methode Kopfschmerzen macht
    public int[][] multiply(int[][] firstMatrix, int[][] secondMatrix) {
        int[][] matrix = new int[firstMatrix.length][secondMatrix[0].length];

        for (int i = 0; i < firstMatrix.length; i++) {
            for (int j = 0; j < secondMatrix[0].length; j++) {
                for (int k = 0; k < firstMatrix[0].length; k++) {
                    matrix[i][j] += firstMatrix[i][k] * secondMatrix[k][j];

                }
            }
        }
        return matrix;
    }
  
    Keine Ahnung was ich hier mache
    public String toString() {
        String s = "";
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                s = String.format("%s ", matrix[i][j]);

            }
        }
        return s;
    }

Aufgabe lautet wie folgt : Also es soll eine nxn Matrix modelliert, werden welche die Addition und Multiplikation beherrscht, sowie eine Matrix darstellen kann.
"
Die Matrix-Vektor-Multiplikation multipliziert dabei eine n x n Matrix mit einem Spaltenvektor.Ein Spaltenvektor entspricht einer n x 1 Matrix.
Erstellen Sie dafür eine Klasse MathMatrix, die die oben genannten Operationen implementiert. In der Matrix-Klasse soll keine Ein- oder Ausgabe stattfinden. Implementieren Sie stattdessen für die Darstellung eine toString ()-Methode, die sie auch für der Operation show verwenden können. Achten Sie darauf, dass die Operation show eine textuelle Repräsentation zurückgibt. Die Matrix wird als durch Zeilenumbrüche separierte Zeilen dargestellt. Jede Zeile besteht aus durch jeweils ein Leerzeichen separierte 32-Bit-Ganzzahl. Die Matrix wird mithilfe eines öffentlichen Konstruktors MathMatrix ( int [][] matrix ) erstellt.

1. Versteh ich es richtig, dass in den Konstruktor eine Matrix gegeben wird, sodass die beiden Rechenoperationen in der Methode nur einen Parameter, also eine Matrix, mitgegeben bekommen? Wie ihr oben seht, hatte ich zuerst 2 Matrizen als Parameter in den Methoden, weil ich den Part in der Aufgabe mit dem Konstruktor überlesen hatte xD

2. Wie zur Hölle geht die toString Methode, denn ohne die, kann ich gar nichts testen . Ich hab oben im code etwas versucht, aber das stimmt sicherlich nicht. Wie die to String Ausgabe auszusehen hat, steht in der Aufgabe, aber ich weiß nicht wie ich das umsetzen soll. Ich weiß zwar, dass matrix.lenght die Zeile ist und matrix[0].length die Spalte darstellt. Aber ich weiß nicht, wie ich das in der toString Methode packe, sodass ich diese richtig überschreibe

3. Ich seh jetzt erst, dass bei der Multiplikation stets von einem Spaltenvektor als 2. Matrize ausgegangen wird, aber mein code dazu oben sollte trotzdem passen oder ?

Edit : Die to String Methode habe ich inzwischen, aber ich glaube ich verstehe die Aufgabe falsch. Die Parameter meiner Rechnungen muss meine Matrix klasse sein bzw ein Objekt davon statt wie ich es habe mit int [][] oder ?
 
Zuletzt bearbeitet:
Edit 2.0 :

Meine alten Methoden mit den 2 Parametern in den methoden beim Rechnen funktionieren beide wie Sie sollen, aber wie kann ich das so abändern, dass ich das irgendwie mit meinem Konstruktor und den damit generierten Matrizen verknüpfe ?
Ich bin irgenwie fast am Ziel, aber doch lost. Wäre sehr lieb, wenn mir jemand kurz helfen könnte
 
Ich denk mal, mein Matrix Attribut speichert nur die mitgegebene Matrix und für die Rechnungen brauch ich ein weiteres Attribut ?
richtig

Edit: Genaugenommen brauchst du kein "Attribut" sondern eine lokale Variable.

Edit2: Und wäre es nicht sinvoller, beispielsweise folgende Methode zu schreiben:
Java:
public Matrix multiply(Matrix other)
statt
Java:
public int[][] multiply(int[][] other)
 
Zuletzt bearbeitet:
Du brauchst nur einen Parameter. Die Berechnung wird dann auf der jeweiligen Instanz und mit einem Parameter ausgeführt. Als Ergebnis der Berechnung kann entweder die jeweilige Instanz verändert sein oder du gibst ein neues Matrix-Objekt zurück. 😉 (Beides ist auch möglich, das wäre dann fluent)
 
richtig

Edit: Genaugenommen brauchst du kein "Attribut" sondern eine lokale Variable.

Das hatte ich anfangs so, aber das kann doch so nicht funktionieren, denn wie soll dann auf die lokale Variable zugegriffen werden ?

Code:
package uebungsblattTwo;

import edu.kit.informatik.Terminal;

public class MathMatrix {

    private int[][] matrix;

    public MathMatrix(int[][] matrix) {
        this.matrix = matrix;
    }

    /*public int[][] add(int[][] firstMatrix, int[][] secondMatrix) {
        matrix = new int[firstMatrix.length][firstMatrix[0].length];

        for (int i = 0; i < firstMatrix.length; i++) {
            for (int j = 0; j < firstMatrix[i].length; j++) {
                matrix[i][j] = firstMatrix[i][j] + secondMatrix[i][j];

            }
        }
        return matrix;
    }*/
    
    public int[][] add(int[][] secondMatrix) {
        int [][] sum = new int[matrix.length][matrix[0].length];

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                sum[i][j] = matrix[i][j] + secondMatrix[i][j];
                
            }
        }
        return sum;
    }
    
    public String toString() {
        StringBuilder builder = new StringBuilder();
        for (int[] m : matrix) {
            for (int i : m) {
                builder.append(i).append(" ");
            }
            builder.append("\n");
        }
        return builder.toString();
    }

So stellst du dir das dann bei der add Methode als Beispiel vor ?
 
Du brauchst nur einen Parameter. Die Berechnung wird dann auf der jeweiligen Instanz und mit einem Parameter ausgeführt. Als Ergebnis der Berechnung kann entweder die jeweilige Instanz verändert sein oder du gibst ein neues Matrix-Objekt zurück. 😉 (Beides ist auch möglich, das wäre dann fluent)

das mit dem neuen Matrix objekt klingt nach einem Weg. Ich versuch das mal. Danke
 
Du musst eine "MathMatrix" zurückgeben. 😉

Wäre das so falsch oder unsauber ? Es funktioniert so auf jeden Fall auch für die Addition ? Aber ansonsten änder ich es um
Code:
edit :
public int[][] add(int[][] secondMatrix) {
        int[][] sum = new int[matrix.length][matrix[0].length];

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                sum[i][j] = matrix[i][j] + secondMatrix[i][j];

            }
        }
        return matrix = sum;
    }
 
Naja, um damit weiterzurechnen wäre es vorteilhafter... als immer neue Objekte selber anzulegen..

Also ich habs jetzt wie oben bei add beschrieben auch für multiply gemacht und es klappt auf jeden Fall. Aber wieso meintest du, dass ich MathMatrix zurückgeben muss? War das darauf bezogen, falls ich die Aufgabe mit deiner 2. Möglichkeit löse (also jedes Mal ein neues Matrix objekt erstellen?)
 
Ja, deine Lösung fände ich nicht legitim.


Ja, genau.

Aber damit mach ich mir das Leben doch unnötig schwer, da dadurch das Weitere rechnen sich unnötig erschwert, da ich dann es mit Matrix Objekten zutun habe, statt mit int[][] Arrays. Dann passen meine Methoden doch auch nicht mehr. Denn im add und muliply wird eine int[][] als Paramter mitgegeben oder ist das auch falsch ?
 
Dann passen meine Methoden doch auch nicht mehr. Denn im add und muliply wird eine int[][] als Paramter mitgegeben oder ist das auch falsch ?
Darauf hat dich @fhoffmann schon hingewiesen: 🙂
Und wäre es nicht sinvoller, beispielsweise folgende Methode zu schreiben:
Java:
public Matrix multiply(Matrix other)
statt
Java:
public int[][] multiply(int[][] other)


Aber damit mach ich mir das Leben doch unnötig schwer, da dadurch das Weitere rechnen sich unnötig erschwert, da ich dann es mit Matrix Objekten zutun habe, statt mit int[][] Arrays.
Andersrum, mit int-Arrays machst du es dir schwerer 😉

Wenn deine Methode auch eine Matrix entgegen nimmt, kannst du sowas schreiben: a.multiply(b).add(c.multiply(d)), wenn du direkt Arrays benutzt, wirst du immer zwischen verschiedenen Dingen konvertieren müssen 🙂
 
Okey das kann ich dann noch easy abändern, aber hat wer eine Ahnung wie ich die show Methode hinbekomme ? Ich hab das bisher :

Code:
public void show() {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                Terminal.printLine(matrix[i][j]);
            }
        }
    }
Das liefert die richtigen Zahlen, aber die falsche Darstellung, da jede Zeile in eine neue Zeile gepackt wird. Tips wie ich das umgehen kann? Nicht verwirren lassen, das terminal entspricht dem system.out.println
 
Da sind wir wieder bei deiner ursprüglichen Frage: Wie soll ich toString implementieren? Das geht so (ungetestet):
Java:
   public String toString() {
        String s = "";
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                s += String.format(%5d ", matrix[i][j]); // hinzufügen (+=)
           }
           s += "/n": // Zeielenumbruch
        }
        return s;
    }
 
Zuletzt bearbeitet:
Da sind wir wieder bei deiner ursprüglichen Frage: Wie soll ich toString implementieren? Das geht so (ungetestet):
Java:
   public String toString() {
        String s = "";
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                s += String.format(%5d ", matrix[i][j]); // hinzufügen (+=)
           }
           s += "/n": // Zeielenumbruch
        }
        return s;
    }
Erstmal danke für die Antwort, aber ich hatte ja schon eine funktionierende toString Methode, die so aussieht :

Code:
public String toString() {
        StringBuilder builder = new StringBuilder();
        for (int[] m : matrix) {
            for (int i : m) {
                builder.append(i).append(" ");
            }
            builder.append("\n");
        }
        return builder.toString();
    }

Die Darstellung gelingt dann auch, wenn ich m mauell printe, aber sobald ich in der show Methode folgendes versuche :

Code:
public void show() {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                Terminal.printLine(matrix[i][j]);
            }
        }

    }

dann wird die toString methode nicht aufgerufen aber wieso nicht ?
 
Wenn du irgendein Objekt print’est wird dessen toString aufgerufen, du machst das aber nur mit ints.
In show brauchst du nur eine einzige Zeile, reicht der Hinweis?

In welcher Klasse liegt show eigentlich?
 
Wenn du irgendein Objekt print’est wird dessen toString aufgerufen, du machst das aber nur mit ints.
In show brauchst du nur eine einzige Zeile, reicht der Hinweis?

In welcher Klasse liegt show eigentlich?

Ja dann war es mir doch klar, dass da mein Matrix objekt rein muss, aber es hängt trotzdem noch irgendwo, denn wie mach ich das. Wie folgt ist es falsch :
Code:
Terminal.printLine(MathMatrix()); // irgendwie muss hier die Matrix rein, aber wie ?

show liegt in der Matrix klasse und ist eine der 3 Methoden, die ich implementieren muss.
 
Oder MUSS ich doch alle Methoden ändern, sodass eine Matrix jedes mal erzeugt wird und zurückgegeben wird. Diese dann als Attribut speichern und das dann für show benutzen ?
 
show liegt in der Matrix klasse
Show soll nicht in der Matrix-Klasse stehen:
In der Matrix-Klasse soll keine Ein- oder Ausgabe stattfinden.


Oder MUSS ich doch alle Methoden ändern, sodass eine Matrix jedes mal erzeugt wird und zurückgegeben wird.
Ja, jede Methode muss ein Matrix-Objekt zurück geben, kein int-Array.


Diese dann als Attribut speichern und das dann für show benutzen ?
In der Matrix selber sollte es nur ein Attribut geben, das eine int-Array, was im Konstruktor zugewiesen wird.
Ins Blaue geraten soll Show vermutlich eine Matrix als Parameter haben.
 
Show soll nicht in der Matrix-Klasse stehen:



Ja, jede Methode muss ein Matrix-Objekt zurück geben, kein int-Array.



In der Matrix selber sollte es nur ein Attribut geben, das eine int-Array, was im Konstruktor zugewiesen wird.
Ins Blaue geraten soll Show vermutlich eine Matrix als Parameter haben.
Wenn schon nicht in der Matrix klasse stehen soll oder darf, wo soll das sonst hin? In die Klasse mit der main Methode oder was ?

Und wer lesen kann ist klar im Vorteil xD, denn du hast Recht. show bekommt eine Matrix als paramter, d.h für mich ich muss jetzt erstmal alle Methoden umschreiben
 
Ich weiß, aber nicht ganz wie die neue Add methode aussehen soll. Also ich denke ich habs fast, aber kannst du mir kurz aushelfen :

Code:
public MathMatrix add1(Mathmatrix mathmatrix) {
        int[][] sum = new int[matrix.length][matrix[0].length];

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                sum[i][j] = matrix[i][j] + secondMatrix[i][j];  // Hier passt es jetzt nicht, secondMatrix war noch der int[][] von vorher

            }
        }
        return new MathMatrix(sum);
    }

Edit :
Hast du dir es so vorgestellt ? So sollte es doch passen
Code:
public MathMatrix add1(MathMatrix mathmatrix) {
        int[][] secondMatrix = mathmatrix.getMatrix();
        int[][] sum = new int[matrix.length][matrix[0].length];

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                sum[i][j] = matrix[i][j] + secondMatrix[i][j];

            }
        }
        return new MathMatrix(sum);
    }

Edit 2.0 : Jetzt bin an genau dem Punkt, den ich vorhin angesprochen habe. Ich erzeuge zwar eine neue Matrix die die Summe aus 2 Matrizen darstellt, aber die wird ja nirgendwo gespeichert oder seh ich das falsch ?
 
Zuletzt bearbeitet:
Wenn schon nicht in der Matrix klasse stehen soll oder darf, wo soll das sonst hin? In die Klasse mit der main Methode oder was ?
Ja, in der Klasse wäre es passender.

Edit 2.0 : Jetzt bin an genau dem Punkt, den ich vorhin angesprochen habe. Ich erzeuge zwar eine neue Matrix die die Summe aus 2 Matrizen darstellt, aber die wird ja nirgendwo gespeichert oder seh ich das falsch ?
Naja, das ist an dir, die irgendwo zu speichern. Rufst du die Methode denn irgendwo auf?
 
Ja, in der Klasse wäre es passender.


Naja, das ist an dir, die irgendwo zu speichern. Rufst du die Methode denn irgendwo auf?

Oh ich hab ja nicht die ganze Aufgabe gepostet, also der Anfang war ja diese Methoden implementieren und der 2. Teil der Aufgabe lautet :
"Zusätzlich erstellen Sie eine Klasse Main, welche eine main ()-Methode enthält, in der die Ein und Ausgabe stattfindet. Die Eingabe findet via Kommandozeilenargumente (Command Line Arguments) statt. Die Kommandozeilenargumente können Sie aus dem args-Parameter der main ()-
Methode auslesen. Als erstes Argument wird die Operation angegeben (s.o.), danach folgen eine Matrix bei show bzw. zwei Matrizen bei add und multiply. Eine Matrix wird dabei als durch Semikolon separierte Liste von Zeilen dargestellt. Eine Zeile besteht aus 32-Bit-Ganzzahlen, die jeweils durch Kommata separiert werden. Sie können davon ausgehen, dass alle Eingaben syntaktisch und semantisch korrekt sind. Das Programm soll daraufhin das Ergebnis der Operation ausgeben. "

Also stand jetzt hab ich die neu erzeugt Matrix als Attribut in der Matrix klasse, aber ob das sinnvoll ist weiß ich noch nicht. Aufjeden Fall besteht jetzt mein Hauptproblem darin, dass ich nicht weiß wie ich die Kommandozeilenargumente so auslesen kann, dass es 1. ein int[][] ergibt, welches ich benutzen kann und 2. dieses Semikolon entferne.
Außerdem bin ich mir bezüglich show immernoch unsicher. Kommt das einfach in die main Methode ? Quasi so
Code:
 .... if (args[0].equals("show")){
 Terminal.println(args[1]);
 }
 
 ??? Das ist doch dann keine methode, sonern einfach eine Anweisung in der main Methode oder seh ich da was falsch
 
Ich verstehe immernoch nicht, wie die Methoden add und multipy mit Matrix objekten funktionieren soll bzw wie die auszusehen haben, denn das was ich habe klappt so nicht, egal was ich tue.

Meine Methoden nur mit den int[][] hingegen klappt aber kann mir bitte wer aushelfen xD

Edit : Nevermind. Ich glaube ich hab verstanden, was ihr meint. Also die Methoden laufen, aber die Probleme aus meinem Beitrag davon mit dem Auslesen von den Werten aus der Kommandozeile und das parsen davon bereitet mir Kopfschmerzen
 
Zuletzt bearbeitet:
Das folgende ist oder sollte die grobe Struktur der main Klasse mit main Methode sein, aber wie gesagt, wie parse ich bitte ein mehrdimensionales Array ? Wenn ich das habe, sollte eigentlich alles passen.
Code:
package uebungsblattTwo;

import edu.kit.informatik.Terminal;

public class MainMatrix {

    public static void main(String[] args) {

        int[][] firstMatrix = args[1];
        int[][] secondMatrix = args[2];
        MathMatrix mathmatrix1 = new MathMatrix(firstMatrix);
        MathMatrix mathmatrix2 = new MathMatrix(secondMatrix);

        if (args[0].equals("add")) {
            mathmatrix1.add1(mathmatrix2);
        } else if (args[0].contentEquals("multiply")) {
            mathmatrix1.multiply1(mathmatrix2);

        } else if (args[0].contentEquals("show")) {
            Terminal.printLine(firstMatrix);
        }
    }
}
 
Java:
int[][] firstMatrix = args[1];
args[1] ist ein String - es kann nicht automatisch in ein int[][] umgewandelt werden.
 
Java:
int[][] firstMatrix = args[1];
args[1] ist ein String - es kann nicht automatisch in ein int[][] umgewandelt werden.

Ja ist mir schon klar, aber danach frag ich euch doch. Mir ist schon klar, dass ich das Kommandozeilenargument parsen muss, aber wie parse ich das bitte bei nem mehrdimensionalen Array ?
args[0] ist einfach, denn das ist einfach immer der Befehl und das ist einfach zu übernehmen, aber wie übersetze ich beispielsweise folgendes : 1 , 2 ; 0,3 3 , 4 ; 3 , 4 ? Das semikolon trennt die jeweiligen Zeilen der Matrix und die leertaste unterscheidet die 2 Matrizen voneinader, aber wie parse ich das?
Ich brauche sicherlich den .split Befehl, aber wie gesagt ich weiß leider nicht wie ich so eine Beispieleingabe übersetzen/parsen kann in ein int[][] das ich benutzen kann
 
Vergiss doch erst einmal die Eingabe über die Konsole!
Probiere, die Klasse MathMatrix sauber zu schreiben
und teste sie mit festen Eingaben in der Main-Funktion.
 
Vergiss doch erst einmal die Eingabe über die Konsole!
Probiere, die Klasse MathMatrix sauber zu schreiben
und teste sie mit festen Eingaben in der Main-Funktion.

Hab ich doch schon und es funktioniert auch alles xD. Hab doch schon paar Posts vorher gesagt, dass ich die Methoden umgeschrieben habe, sodass beim Rechnen immer eine MathMatrix zurückgegeben wird . Deswegen brauch ich nur noch die main methode und das einzige was mir da fehlt ist das parsen der Kommandoargumente
 
und das einzige was mir da fehlt ist das parsen der Kommandoargumente
Dann musst du erst einmal einen "Vertrag" mit dir selber machen, wie du die Matrixelemente eingeben willst.

Wahrscheeinlich sollen die Elemente in einer Zeile durch Leerzeichen (oder durch Tabulatoren?) getrennt sein.
Mehere Zeilen sollen durch einen "Zeilenumbruch" (möglicherweise "0D0A") getrennt werden. Aber es wäre natürlich ebenso möglich, unterschiedliche Zeilen durch "X" zu trennen.

Was willst du?
 
Wie MrBrown schon gesehen hat und gerade geschrieben hat, ist es schon vorgegeben. " Eine Matrix wird dabei als durch Semikolon separierte Liste von Zeilen dargestellt. Eine Zeile besteht aus 32-Bit-Ganzzahlen, die jeweils durch Kommata separiert werden "

Aber jetzt nochmal zur Frage wie parst man das ? Normale Integers sind ja einfach mit Integer.parseint(args[..]) zu parsen. Vor kurzem hab ich auch gelernt, wie man ein Array parst, aber wie man das jetzt macht, weiß ich einfach nicht. Deswegen brauch ich eure Hilfe bitte
 
Was hast du denn dort gelernt?

Wenn ich beispielsweise bei der Kommandozeilenargumente 1, 2 ,3 ,4 ,5 .... mitgeben, dann kann ich einfach mit einer schleife :
Code:
for (int i = 0; i < args.length; i++) {
            Integer.parseInt(args[i]);
        } // Diese Werte dann einfach noch speichern oder direkt weiterverwenden , aber wie soll das an meinem Bsp mit mehrdimensionalen Arrays gehen
 
Und wie man mit Strings arbeitet hast du doch sicher auch gelernt?
Ich versteh leider nicht, worauf du hinaus willst 🙁

Ansatz sieht doch so aus :
Code:
public static void main(String[] args) {

        String[] firstmatrix = args[1].split(";");
       
        // Jetzt trennt er bei der Einagbe : 1,2;0,3 1,2 und 0,3 voneinander und speichert diese in mein String array oder ?

Edit: Falls der Ansatz stimmt, dann ist die Länge meines String Arrays ja theoretisch die Zeilenanzahl meiner Matrix
 
Wieso funktioniert das folgende aber nicht?
Code:
public static void main(String[] args) {

        String[] firstmatrix = args[1].split(";");
       
        for(int i=0; i< firstmatrix.length; i++) {
            Terminal.printLine(firstmatrix[i]);
        }

Will nur kurz sehen, ob der String Array richtig gesplitted wurde, aber krieg eine ArrayOutOfBounds
Edit : Vergiss es. ich bin hohl
 

Neue Themen


Zurück
Oben