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

Diskutiere Matrix Klasse mit Mehrdimensionalen Array (Addition, Multiplikation, to String) im Java Basics - Anfänger-Themen Bereich.
Z

zDieTaschenlampe

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:
Z

zDieTaschenlampe

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
 
F

fhoffmann

Du solltest dir überlegen, was das Member matrix ist und es nicht als Ergebnis deiner Rechnungen missbrauchen.
 
Z

zDieTaschenlampe

Du solltest dir überlegen, was das Member matrix ist und es nicht als Ergebnis deiner Rechnungen missbrauchen.
Ich denk mal, mein Matrix Attribut speichert nur die mitgegebene Matrix und für die Rechnungen brauch ich ein weiteres Attribut ? oder kannst du es mir erklären
 
F

fhoffmann

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:
L

LMessi

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)
 
Z

zDieTaschenlampe

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 ?
 
Z

zDieTaschenlampe

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
 
Z

zDieTaschenlampe

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;
    }
 
L

LMessi

Naja, um damit weiterzurechnen wäre es vorteilhafter... als immer neue Objekte selber anzulegen..
 
Z

zDieTaschenlampe

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?)
 
Z

zDieTaschenlampe

Das Ergebnis eine Matrix-Multiplikation oder Addition ist doch eine Matrix? Also Matrix auch zurück geben :)
Mir gehts um die Frage, ob ich MathMatrix (also das objekt) zurückgeben muss oder ob es so passt, wie ich es getan habe. Ich hab quasi einen int[][] zurückgeben, der ja qausi meine Matrix ist. Verstehst du was ich meine ?
 
mrBrown

mrBrown

Mir gehts um die Frage, ob ich MathMatrix (also das objekt) zurückgeben muss oder ob es so passt, wie ich es getan habe. Ich hab quasi einen int[][] zurückgeben, der ja qausi meine Matrix ist. Verstehst du was ich meine ?
MathMatrix ist eine Matrix. int[][] ist einfach nur ein 2-dimensionales-int-Array, aber keine Matrix :)
 
Z

zDieTaschenlampe

MathMatrix ist eine Matrix. int[][] ist einfach nur ein 2-dimensionales-int-Array, aber keine Matrix :)
Du findest meine Lösung also nicht legitim ? Ich versteh aber nicht ganz, wie du dir das vorstellst mit dem Rückgabetyp MathMatrix ? Soll ich dann am Ende ein neues Objekt erstellen und das returnen ?
 
Z

zDieTaschenlampe

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 ?
 
mrBrown

mrBrown

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 :)
 
Thema: 

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

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben