Vererbung Submatrix mit Verweis auf Matrix erstellen

Noblord

Mitglied
Hallo,
ich weiß der Thread ist nicht aussagekräftig aber mir ist kein stichwort bekannt mit dem ich mein Problem beschreiben kann...
also zum Problem:
ich besitze eine Matrixklasse auf der die Strassen-Matrixmultiplikation implementiert ist.
https://de.wikipedia.org/wiki/Strassen-Algorithmus
um nicht immer neue (speicher und laufzeitintensive) Matrizen erstellen zu müssen habe ich den Tipp bekommen Submatrizen zu erstellen die von der Klasse Matrix erben aber "keinen" Speicher verbrauchen indem sie auf auf einen Quadranten der ursprünglichen Matrix verweisen.
Nun habe ich aber keine Idee wie ich das machen sollte oder unter welchem Stichwort ich nach Hilfe suchen kann.
Schon mal danke im vorraus 🙂
 
public class Matrix {

private int height;
private int width;

private int[][] value;

public Matrix(int[][] value) {
this.value = value;
this.height = value.length;
this.width = value[1].length;
}
}

... sry für die formatierung
im prinzip gehts nur um diesen ausschnitt.
in der Submatrix Klasse sollte auf einen quadranten der matrix verwießen werden ohne ein neues 2-dim int array zu erstellen.
 
Das ginge recht leicht, wenn die Sub-Matrizen auf das gleiche int-Array verweisen, und jeweils zusätzlich zur Höhe und Breite noch die Indizes, an denen sie starten speichern.

Du musst dann nur drauf achten, dass die Arrays nicht verändert werden, also auf Setter verzichten und im (öffentlichen) Konstruktor am besten auch defensive Kopien machen
 
also übergebe ich dem Konstruktor einen ausschnitt aus dem alten int [][]?
wenn ja wie bekomme ich diesen ausschnitt ohne ein neues int[][] anzulegen?
 
also übergebe ich dem Konstruktor einen ausschnitt aus dem alten int [][]?
wenn ja wie bekomme ich diesen ausschnitt ohne ein neues int[][] anzulegen?
Du übergibst keinen Ausschnitt, sondern das ganze alte int[][], dazu aber die Koordinaten des Ausschnitts, dann brauchst du es nicht kopieren oder neu zu erstellen
 
Ich würde es etwa in folgender Art machen.
Java:
interface Matrix {
    int dimension();
    double get(int i, int j);
}

class SpeicherMatrix implements Matrix {
    double[][] values;
    int dimension() {
        return values.length;
    }
    double get(int i, int j) {
        return values[i][j];
    }
}

class Quadrant implements Matrix {
    Matrix matrix;
    int quadrantX; // nur 0 und 1 erlaubt
    int quadrantY; // nur 0 und 1 erlaubt
    int dimension() {
        return matrix.dimension() / 2;
    }
    double get(int i, int j) {
        return matrix.get(quadrantX * dimension() + i, quadrantY * dimension() + j);
    }
}
Dabei sollten natürlich einige Werte (z.B. die Dimension) zwischengespeichert werden statt sie ständig neu zu berechnen.
 
public class SubMatrix extends Matrix {

int x;
int y;
int size;

public SubMatrix(int[][] value, int x, int y) {
super(value);
this.x = x;
this.y = y;
size = value.length/2;
// TODO Auto-generated constructor stub
}

}


aber so wie es jetzt ist muss ich alle methoden so modifizieren dass sie nur einen Ausschnitt der Matrix benutzen
 
Ich würd's eher so machen:

Java:
 private Matrix(final int[][] values, final int width, final int height, final int offsetI, final int offsetJ) {
        this.values = values;
        this.width = width;
        this.height = height;
        this.offsetI = offsetI;
        this.offsetJ = offsetJ;
    }

public int get(int i, int j) {
    return values[offsetI + i][offsetJ + j];
}

Ändern musst du nur einmal viel: Zugriffe auf Variablen auf Getter auslagern. Das sollten die meisten IDEs größtenteils automatisch machen.

Ansonsten fällt mir zu solchen Optimierungen nur ein:
M.A.Jackson hat gesagt.:
Rules of Optimization:
Rule 1: Don’t do it.
Rule 2 (for experts only): Don’t do it yet.

Je nach Usecase hat so eine Optimierung halt immer auch Nachteile...
 

Neue Themen


Zurück
Oben