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.
also ich glaube, dass das was ich aus deinem Ansatz gemacht habe, funktioniert, aber ich bekomme andauernd ein OutOfBounds ...
daher frage ich noch mal nach, ob ich das so richtig verstanden habe.
Ich habe eine untere Dreiecksmatrix. Ich speichere nur die Einträge auf den Diagonalen 1 und 2. (Die Anzahl der Diagonalen kann variieren, daher habe ich hierfür eine Variable).
Java:
public SymmetrischeBandMatrix(int dim, int anzahlDiagonalen)throws Ausnahme{
if (anzahlDiagonalen > dim){
throw new Ausnahme ("Die Anzahl der Diagonalen uebersteigt die Dimension der Matrix");
}
this. anzahlDiagonalen = anzahlDiagonalen;
this.dim=dim;
this.matrix2D=new double [dim][];
for (int i=0;i< dim;i++){
matrix2D[dim-i-1]=new double [i+1 > anzahlDiagonalen ? anzahlDiagonalen : i+1 ];
Es wird doch jetzt die folgende Struktur erstellt, nicht wahr?
Hallo.
Die Struktur wird schon richtig erstellt.
Erhältst du den OutOfBounds innerhalb der gezeigten Methode, oder erst nachdem du die Struktur erstellt hast und sie beschreiben/lesen willst? (Denke daran, dass die Index-Werte mit '0' beginnen, bis 'n-1', für n=Länge!)
Du läufst hier in der For-Schleife sozusagen von oben nach unten, kehrst aber in in der nächsten Zeile das ganze auf den Kopf, damit du die Struktur von unten nach oben aufbauen kannst.
int ii = 0;
for (int i=dim-1; i>=0; i--){
if(ii+1 < anzahlDiagonalen) ii++;
matrix2D[i]=new double [ii];
}
Das finde ich nachvollziehbarer und besser lesbarer, und wenn du dier Struktur ungekehrt aufbauen möchtest, dann brauchst du nur die For-Schleifen-Bedingung ändern.
public void setKoeffizient2D(int n, int m,double koeffizient)throws Ausnahme{
if (n > anzahlDiagonalen || m > anzahlDiagonalen){throw new Ausnahme("Einer oder mehrere der gesetzten Werte befinden sich ausserhalb der Bandbreite");
}
// Vertauschung des Spalten/Zeilenindex durch Hilfsvariable, da Setter Methode keinen return besitzt
if (m>n){
int y = n;
n = m;
m = y;
// Schleife, die die nicht benötigten Felder aus utnerer Dreiecksmatrix löschst
int z=0;
if (n>anzahlDiagonalen){
n = z;
}
}
int positionInDiagonale = m;
int diagonale = n-m;
matrix2D[positionInDiagonale][diagonale] = koeffizient;
}
Hallo.
Also den Sinn der Methode, warum du da tauscht etc, dem kann ich nicht ganz folgen..
z.B.:
Du benennst im Kommentar eine Schleife , die keine Schleife ist, sondern nur n auf 0 zurücksetzt, wenn n ausserhalb des gültigen Bereiches ist; und dies fängst du aber ja schon in der ersten throw-Anweisung ab;
Du musst am Ende auf jeden Fall irgendwie sicherstellen, dass dann der Zugriff ins Array auch im gültigen Bereich ist.
Wenn ein Array z.B. die Länge n hat, dann dürfen halt nur Indizes von 0 bis n-1 verwendet werden!!
Deine letzte Zeile könntest einmal derartig formulieren:
Java:
if(0<=positionInDiagonale && positionInDiagonale<matrix2D.length){
if(0<=diagonale && diagonale<matrix2D[positionInDiagonale].length){
matrix2D[positionInDiagonale][diagonale] = koeffizient;
}else{
throw new Ausnahme("diagonale is invalid: ["+positionInDiagonale+"]["+diagonale+"]");
}
}else{
throw new Ausnahme("positionInDiagonale is invalid: ["+positionInDiagonale"]");
}