std::Vector<> nur obere Dreiecksmatrix speichern.
-
Hallo,
in meiner Klasse gibt es einen vector den ich wie folgt anspreche:
std::vector<float> vec[x*b+y] = irgendwasDieser hat die länge b^2 und x,y ist der index von Spalte und Zeile.
Da ich nur die obere Dreiecksmatrix benötige und b sehr groß werden kann habe ich sehr viel overhead den ich vermeiden möchte.
Wie kann ich diesen Vector mit x,y und b indizieren wenn ich als länge (n*n-1)/2
nehme also nur die obere Dreiecksmatrix ohne Hauptdiagonale ?Vielen Dank für eure Hilfe.
-
nimm doch einen zweidimensionalen vektor
std::vector<std::vector<float> > dreieck; cout << dreieck[1][2] < endl;Wenn du wirklich bei eindimensional bleiben willst, musst du dir selber eine Funktion ausdenken, wie du die mit x, y indizierst. Außerdem müsstest du auch nochn test einbauen, ob die koords überhaupt gültig sind.
-
Vielen Dank für deine Antwort aber ein 2D-Vector kommt nicht in Frage.
-
warum nicht?
Eine Gleichung könnte zB sein:
Anordnung: b=4 0 1 2 3 4 5 6 7 8 9 gesucht: p(x, y, b) die die koords dem dreieck zurodnet p(x, y, b) = Index(y, b) + x Index(y, b) = GesamtAnzahl - AnzahlUnterY = [b * (b+1)]/2 - [(b-y)*(b-y+1)]/2Rest kannste selber zusammenfassen. Ich denke das müsste so stimmen. Ist jetzt aber eben keine Bereichsprüfung drin
-
qbitus schrieb:
Da ich nur die obere Dreiecksmatrix benötige und b sehr groß werden kann habe ich sehr viel overhead den ich vermeiden möchte.
Wie kann ich diesen Vector mit x,y und b indizieren wenn ich als länge (n*n-1)/2
nehme also nur die obere Dreiecksmatrix ohne Hauptdiagonale ?Meinst Du so eine Anordnung?
x -> 0 - 1 - 2 - 3 - 4 y 0 . 0 1 3 6 | 1 . . 2 4 7 v 2 . . . 5 8 3 . . . . 9dann wäre das
assert( x > y ); std::vector<float> vec[x*(x-1)/2 + y] = irgendwas;Gruß
Werner
-
Vielen Dank erstmal
y -> 0 - 1 - 2 - 3 - 4 x 0 . 0 1 2 3 | 1 . . 4 5 6 v 2 . . . 7 8 3 . . . . 9Das ist meine aktuelle Anordnung.
Aber da kann ich ja einfach x und y vertauschen, oder ?
-
qbitus schrieb:
y -> 0 - 1 - 2 - 3 - 4 x 0 . 0 1 2 3 | 1 . . 4 5 6 v 2 . . . 7 8 3 . . . . 9Das ist meine aktuelle Anordnung.
Aber da kann ich ja einfach x und y vertauschen, oder ?so einfach ist es nicht, wie man durch ausprobieren leicht feststellen kann
.In diesem Fall müsste das ganze wohl lauten:
assert( y > x ); std::vector<float> vec[x*(2*n - 3 - x)/2 + y - 1] = irgendwas;'n' ist die Größe der Matrix, also im Beispiel oben wäre n=5.
Gruß
Werner