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] = irgendwas
    

    Dieser 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)]/2
    

    Rest 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  .   .   .   .   9
    

    dann 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  .   .   .   .   9
    

    Das 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  .   .   .   .   9
    

    Das 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


Anmelden zum Antworten