Dreidimensionale Matrix erzeugen und verwalten



  • Hallo allerseits,

    ich stehe derzeit vor dem Problem eine dreidimensionale Matrix zu erzeugen. Dabei sollen zwei Dimensionen fix sein, also jeweils eine festen Indexparameter aufweisen. Die dritte Dimension soll während der Laufzeit des Programms in ihrer Ausdehnung verändert werden können (alte Indexelemente sollen entfernt bzw. neue hinzugefügt werden können).
    Nach einiger Recherche im Netz bin ich ehr verwirrter als zuvor. Unter Schlagworten wie: „mehrdimensionale/ verschachtelte ... (rohe) Arrays/Vektoren/ (Container-Klasse) Arrays [C++11-Standard]“ findet man zwar allerlei Meinungen und Herangehensweisen, aber nichts was mich substanziell zu einer Lösung geführt hätte.

    Meine Ziele nochmal in Kurzform:

    - Erstellung einer Matrix mit drei Dimensionen, wobei eine Dimension in ihrer Ausdehnung während der Laufzeit veränderbar sein soll.

    -Setzen und Auslesen einzelner Elemente der Matrix durch Aufruf des zugehörigen Indizes.

    -Angesichts der Tatsache, dass C++ offenkundig mehrere Lösungswege anbietet, wäre es nett, wenn vielleicht zu den von Euch vorgeschlagenen Ansätzen eine Einschätzung hinsichtlich der Performance abgegeben werden könnte.

    Ich hab die Erklärung zunächst kurz und allgemein gehalten, sollten zur Beantwortung noch mehr Details benötigt werden, einfach anmerken. 😉



  • Klingt nach einer Art vector<matrix2d>. Zugriffe sind relativ flott, aber Einfuegen/Entfernen in der Mitte langsam. Kommt daher drauf an, wie oft du das machst.



  • DerK schrieb:

    Angesichts der Tatsache, dass C++ offenkundig mehrere Lösungswege anbietet, wäre es nett, wenn vielleicht zu den von Euch vorgeschlagenen Ansätzen eine Einschätzung hinsichtlich der Performance abgegeben werden könnte.

    Die Einschätzung ist: "Es kommt drauf an". 🙂

    Du kannst hier nicht erwarten, dass man Use-Cases errät und für verschiedene Use-Cases die Performance schätzt.

    Sag mal, was (welche Operationen) du wie oft machen musst.



  • Danke erstmal über die schnellen Antworten.

    kkaw schrieb:

    Die Einschätzung ist: "Es kommt drauf an". 🙂

    Du kannst hier nicht erwarten, dass man Use-Cases errät und für verschiedene Use-Cases die Performance schätzt.

    Sag mal, was (welche Operationen) du wie oft machen musst.

    Die Dimensionen der Matrix sollen umfassen: "Name", "Abteilung" und "Art der Betriebszugehörigkeit". Wobei die Dimension "Name" zur Laufzeit veränderbar sein soll. Die Löschung von Namen sollte relativ selten geschehen, aber möglich sein. Häufiger dürfte es vorkommen, dass man neue Mitarbeiter hinzuträgt, also dürfte es sich somit vorwiegend um eine Einfügung am Ende handeln.

    Kellerautomat schrieb:

    Klingt nach einer Art vector<matrix2d>. Zugriffe sind relativ flott, aber Einfuegen/Entfernen in der Mitte langsam. Kommt daher drauf an, wie oft du das machst.

    Was Du vorschlägst, klingt für mich wie verschachtelte Vektoren(?!). Könntest Du das ganze etwas näher ausführen. Also erklären, wie die Verschachtelung genau aufgebaut sein sollte und was es beim Zugriff mittels Indexangabe auf einzelne Elemtente zu beachten gibt (wie man vorgeht)?

    Weitere Beiträge von anderen Usern sind natürlich auch gerne gesehen. 😃



  • Ich kann da keine konsistente Problembeschreibung sehen. Erst erzählst du etwas von 3 Dimensionen und Ausdenhungen in den 3 Dimensionen in einer Art und Weise, dass Leute an 3D-Arrays denken (siehe Kellerautomats Vorschlat vector<matrix2d> )

    Und jetzt erzählst du etwas, was sich eher nach einer Tabelle mit 3 Spalten für "Name", "Abteilung" und "Betriebszugehörigkeit" etc anhört. Das klingt eher nach einer Datenbank.

    Mach Dir erst mal klar, was für eine Datenstruktur du haben willst.



  • kkaw schrieb:

    Ich kann da keine konsistente Problembeschreibung sehen. Erst erzählst du etwas von 3 Dimensionen und Ausdenhungen in den 3 Dimensionen in einer Art und Weise, dass Leute an 3D-Arrays denken (siehe Kellerautomats Vorschlat vector<matrix2d> )

    Und jetzt erzählst du etwas, was sich eher nach einer Tabelle mit 3 Spalten für "Name", "Abteilung" und "Betriebszugehörigkeit" etc anhört. Das klingt eher nach einer Datenbank.

    Mach Dir erst mal klar, was für eine Datenstruktur du haben willst.

    Der Sinne des Ganzen sieht in etwa so aus: Jeder Mitarbeiter wird durch drei Elemente charakteresiert "Name/Mitarbeiternummer", "Abteilung", "Art der Betriebszugehörigkeit" diese sind praktisch konstant (bzw. dürften sich nur in Ausnahmefällen ändern). Darüber hinaus verfügt aber jeder Mitarbeiter über eine Reihe an Angaben, die sich laufend verändern, z.B. Absatzmenge im Quartal, Letzter Betriebsstandort der Tätigkeit, Spesenabrechnungen, Boni, etc.. Die Idee ist nun, dass die drei "konstanten" Charakteristika als Dimensionen angelegt werden, wodurch jeder Mitarbeiter (als Element der Matrix) durch einen Index genau zuzuordnen wäre. Alle anderen Merkmale würden dann jeweils in eine Tabelle verwaltet werden, deren "Schnittstelle" quasi das Matrixelement darstellt. Der Index dient dabei der klaren Zuordnung (Veränderung/ Abrufung) der Informationen.

    Hoffe, dass die Antwort etwas erhellend war.



  • Warum nicht so:

    class Mitarbeiter
    {
        string name;
        // Abteilung (string oder enum)
        // Zugehörigkeitsart (string oder enum)
    
        std::vector<IrgendEinTyp> extra_info;
    };
    

    Oder sind alle zusätzlichen Infos bekannt? Wenn ja, kann man die ja auch als normale Typen einfügen.



  • Der Vorteil einer Matrix wäre eine vereinfachte Veränderung durch Vektoraddition. Z.B. Könnte man sagen, dass alle Mitarbeiter die an einem bestimmten (Standort-)Projekt arbeiten, einen Bonus in bestimmter Höhe erhalten sollen, oder wenn Leistungen zwischen zwei Abteilungen verrechnet werden würden, so könnte man dies über einen Vektor meiner Ansicht nach gut lösen. Ich bin natürlich für weiter Vorschläge jenseits einer Matrix offen. Ich hoffe bloß, dass ich das mit meiner Schulmathematik auch erschließen kann. 😉


Log in to reply