Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
VererbungSubmatrix mit Verweis auf Matrix erstellen
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
... 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
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
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.
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.