speichern von eigen-matrizen unterschiedlicher länge



  • hallo,

    ich habe eine funktion, die mir in abhängigkeit eines übergabeparameters eine (fest definierte) eigen-matrix zurück gibt.
    diese verwalte ich momentan über eine switch-case anweisung.
    da die matrizen (bestehend aus int) zum teil recht groß sind und ich immer ein break für jeden case benötige, wird das schnell unübersichtlich.
    gibt es hierfür eine bessere oder elegantere lösung?



  • Kannst du bitte einen Auszug aus der Funktion als auch Signatur posten! Oder besser: ein Onlineportal wie ideone.com nutzen um den Code zur Ansicht bereitzustellen.



  • klar, kein problem.

    eigen::matrix GetMatrix(const int _numdim)
    {
        eigen::matrix pre_def = eigen::matrix(_numdim);
        switch(_numdim)
        {
            ....
            case  6:{pre_def << 52,26,13,38,19,41;break;}
            case  7:{pre_def << 14,67,37,104,25,84,50;break;}
            case  8:{pre_def << 292,146,73,448,56,7,273,98;break;}
            ....
        }
        return pre_def;
    }
    

  • Mod

    Woher kommen die Zahlen?



  • die sind von mir so festgelegt worden


  • Mod

    smdy schrieb:

    die sind von mir so festgelegt worden

    Wenn das halt Daten sind, die irgendwie aus dem Nichts kommen, dann kommen die im Programm eben auch irgendwo aus dem Nichts. Großartig schöner geht das nicht.



  • Du könntest wenigstens eine Funktion die etwa so aussieht:

    std::vector<int> createData(int n)
    {
    	if ( n == 1 )
    		return std::vector<int>({24, 25, 4, 23, 2314});
    	if ( n == 5 )
    		return std::vector<int>({24, 25, 21342, 0, 2424, 23, 2314});
    	if ( n == 6 )
    		return std::vector<int>({24, 25, 4, 23, 9823, 12, 2378, 33, 2314});
    	// ...
    }
    

    Das die Daten halt nicht einfach so als Magic Numbers da stehen. (Ist aber immer noch alles andere als schön und flexibel)

    Die Frage ist aber eher, was sind das für Daten und woher hast du sie dann?



  • erstmal danke für die Antworten!

    Das sind binär-codes, die als int verschlüsselt sind. Wieso ist es so wichtig, wo die daten herkommen??


  • Mod

    HoCiEp3 schrieb:

    Wieso ist es so wichtig, wo die daten herkommen??

    Die Berechnungsfunktion wird erfahrungsgemäß oft sehr viel kompakter und übersichtlicher sein als eine große Tabelle mit den Ergebnissen. Daher liegt es nahe, diese Daten nicht fest ins Programm zu codieren, sondern zu berechnen. Sei es zur Laufzeit (mag zwar ein paar Takte am Anfang des Programms verschwenden, aber wen interessiert das schon?) oder zur Compilezeit (Templatemetaprogrammierung - ist aber kein ganz einfaches Thema).



  • Ah, ich verstehe.

    leider will ich genau damit die Berechnungsfunktion umgehen.
    da sie sehr lange rechnet, ist es deutlich schneller, das Ergebnis zu speichern!



  • da sie sehr lange rechnet, ist es deutlich schneller, das Ergebnis zu speichern!

    Kann ich mir ehrlich gesagt nur schwer vorstellen. Was sind das denn für komplexe Berechnungen ?



  • @HoCiEp3: Sag einfach die Daten sollen aus einer csv-Datei eingelesen werden, das reicht als Angabe der Herkunft der Daten und man kann damit ein ordentliches Programm basteln.



  • DarkShadow44 schrieb:

    da sie sehr lange rechnet, ist es deutlich schneller, das Ergebnis zu speichern!

    Kann ich mir ehrlich gesagt nur schwer vorstellen. Was sind das denn für komplexe Berechnungen ?

    Ist aber (leider) so. ist ein Optimierungsalgorithmus, der die beste kombination aus tausenden von möglichkeiten sucht.



  • NP hartes Problem ist NP hart? 🙂

    //edit @Skym0sh0
    Deine Code Veränderung hat jetzt aber auch nicht wirklich irgendeine Magic number klarer gemacht. Es ist vielleicht jetzt näher an dem was du schreibst, aber kine Zahl ist wirklich besser erklärt. Man könnte sogar einwenden, dass dein Code weniger klar ist, weil er das switch über mehrere ifs emuliert und dadurch verschleiert.



  • Ja, da hast du recht.

    Der erste Schritt in solch einem Fall ist aber für mich erstmal, die Initialisierung in eine Funktion zu kapseln. Von außen sieht das dann nicht mehr so "Magic" aus.
    Im nächsten Schritt kann das ja durch Datei Auslesen ersetzen oder durch Berechnen.

    Auf jedenfall sieht es von außen so aus wie: Ich hole mir ein Array/vector voll von den richtigen Zahlen.
    Anstelle von: Mh, ich habe jetzt 10 if's und schiebe je nachdem ein paar Zahlen in mein Array.

    Die Schlüsselfrage war ja eh von SeppJ, woher die Daten halt kommen.


Log in to reply