speichersparende Darstellung für Dreiecksmatrix



  • Ich suche eine speichersparende (sehr wichtig !!!) Darstellung für eine Dreiecksmatrix (d.h. nur die Werte unterhalb der Diagonale sind gesetzt) nach folgendem Muster:

    struct TriangularMatrix {

    ...

    }

    zusätzlich suche ich noch einfache Implementierungen folgender Funktionen:

    TriangularMatrix* Create (int n, int m)

    void Delete (TriangularMatrix* &pMatrix)
    // gibt Speicher frei und setzt pMatrix auf NULL

    bool set (const TriangularMatrix* pMatrix, int value, int row, int col) // gibt true zurück falls der Wert gesetzt werden kann

    bool get (const TriangularMatrix* pMatrix, int& value, int row, int col) // gibt true zurück falls es sich um eine korrekte Position handelt

    Bitte, bitte helft mir !!!

    Schöne Grüsse
    Chris



  • die Werte unterhalb der Diagonale sind gesetzt

    also nur werte unterhalb der linie zwischen links oben und rechts unten, oder zwischen rechts oben und links unten?
    soll die diagonale selber noch werte enthalten oder nicht?

    überseh ich da jetzt was, oder kannst du die aufgabe, eine matrix zu erstellen nicht dem ctor und die aufgabe die matrix zu zerstören dem dtor überlassen?

    und wie hoch ist die Wahrscheinlichkeit,dass du, wenn du einen Wert setzt, und die Matrix durch den Ctor erstellst,eine methode wie set/get fehlschlägt?

    die fragen stell ich dir,weil sie mir auch mal gestellt wurden,ich meine Klasse überarbeitet hab, und gleich alles viel besser läuft 😉

    //edit achja, und in c++ benutzt man,wenn man strukturen mit methoden hat lieber gleich Klassen, as is konsequenter 😉



  • 1.) In der ersten Zeile ist der erste Wert gesetzt, in der zweiten Zeile die ersten beiden Werte usw.
    2.)Ich muss es ohne Klassen und ohne constructor und destructor implementieren !!!



  • also eine Schulaufgabe?



  • also eine Schulaufgabe?

    -->jo 😮 wiedermal in der übungsstunde nicht aufgepasst 😉 😉

    -> speichersparendste Darstellung ist ein array[] jedes --> array[][] kann ja auch als array[] dargestellt werden mann muss sich nur die position rausrechnen!
    bsp array[2][2] --> array[5]

    1
    11
    111

    um das zu bekommen zählt man zb bis zeile 2 alle vorkommenden 1ser == 3 und in der 2ten zeile dann die die einser bis der Spaltenzwier (array[bla][2])erreicht ist! 3 + 2 = 5 --->array[5]
    oder
    1
    11
    111
    1111
    11111
    zb array[3][3]
    alle 1 ser bis zeile 4 = 5 + 4 = 9 -> array[9]



  • am speicher sparendsten und dabei konfortabelsten wär wahrscheinlich sowas:

    struct Values{
        float _11,
              _21,_22,
              _31,_32,_33,
              _41,_42,_43,_44;//alle werte des arrays schön übersichtlich
    }
    struct TriangularMatrix { 
        union{
            Values values;
            float array_values[10];
        }
    }
    

    so, nun kann man entweder die Values direkt ansprechen, man hat ja eine schöne struktur, oder man versucht, das 1d array auf ein 2d array abzubilden.
    zum abbilden auf ein 2d array gibts mehrere möglichkeiten, für den fall hier würde sich denk ich mal das hier empfehlen:

    //funktion zum auswählen des array elements
    int get_element(int zeile,int element_nr=0){
       if(zeile>0){
           int i;
           if(element_nr>0){
               i=zeile;
           }
           else
           {
               i=spalte;
           }
           return i+get_element(--zeile);
       }
       return 0;
    }
    

    erklärung: jede spalte hat genausoviele elemente wie die position in der sie sich befindet.
    also zeile 4 hat 4 elemente,zeile 3 3elemente usw.
    dh wenn jemand das element 4/4 haben will muss er
    4+3+2+1 rechnen um seine endgültige position zu bekommen, da 4/4 ja das letzte element ist.
    wenn aber nun 4/1 gesucht wird, muss man 1+3+2+1 rechnen, und die funktion oben macht nicht anderes, bzw rekursiv.
    es wird von der gewählten zeile nach unten immer die elementanzahl draufadiert.
    wenn du willst kannst du noch ne funktion einbauen, ob die gewählte elementnr <= der zeilennr ist, aber das ist deine sache 😃


Anmelden zum Antworten