Daten in einer Matrix halten (C++)



  • operator void schrieb:

    Wenn die Größe der Matrizen zur Kompilierungszeit feststeht, kannst du template-Parameter draus machen und ein statisches Array als Element nehmen. Das dürfte wohl das schnellstmögliche sein

    Wenn das mal keine Idee ist 😉 . Du vergisst aber, dass man mit Matrizen in der Regel auch rechnen will (sonst könnte man ja auch sofort ein 2d-Array nehmen). Und genau da bekommst du ein Problem mit den Template-Parametern.



  • MaSTaH schrieb:

    operator void schrieb:

    Wenn die Größe der Matrizen zur Kompilierungszeit feststeht, kannst du template-Parameter draus machen und ein statisches Array als Element nehmen. Das dürfte wohl das schnellstmögliche sein

    Wenn das mal keine Idee ist 😉 . Du vergisst aber, dass man mit Matrizen in der Regel auch rechnen will (sonst könnte man ja auch sofort ein 2d-Array nehmen). Und genau da bekommst du ein Problem mit den Template-Parametern.

    warum?

    template<class T,size_t AM,size_t AN,size_t BM,size_t BN>
    Matrix<T,AM,BN> operator*(Matrix<T,AM,AN> const& a,Matrix<T,BM,BN> const& b);
    

    vielleicht freakiger mit sowaswas wie:

    template<class AT,size_t AM,size_t AN,class BT,size_t BM,size_t BN>
    Matrix<SumType<ProductType<AT,BT>::Type,ProductType<AT,BT>::Type>::Type,AM,BN> operator*(Matrix<AT,AM,AN> const& a,Matrix<BT,BM,BN> const& b);
    


  • Naja, aber ob dies das Wahre ist? 😉 Wenn du wirklich weißt wie groß die Matrizen sind dann geht sowas natürlich, aber das muss doch ein riesen Kompilat geben wenn man nur ein paar Rechenopertionen á la: "(A.transp() * 😎 * C". Unter Umständen hast du nach dieser Operation schon 4 Klassen generiert.



  • volkard schrieb:

    vector<vector<double>> liegt nicht in deinem sinne, denn jeder einzelne der untervektoren braucht nicht ne eigene größe zu haben.

    Dafür spräche aber, dass man so den mysteriösen [][]-"Operator" hätte. Andererseits könnte man ja auch () überladen. Sieht aber imho nicht wirklich nach Matrix aus wenn man sagt matrix(10, 2). Da finde ich matrix[10][2] schöner.



  • MaSTaH schrieb:

    Naja, aber ob dies das Wahre ist? 😉 Wenn du wirklich weißt wie groß die Matrizen sind dann geht sowas natürlich, aber das muss doch ein riesen Kompilat geben wenn man nur ein paar Rechenopertionen á la: "(A.transp() * 😎 * C". Unter Umständen hast du nach dieser Operation schon 4 Klassen generiert.

    das wahre zu suchen ist doch unser job.

    sagen wir mal, wenn der grafikprogger lauter 3- und 4-dimensionale hat, dann nimmt er wohl die einfachsten template-dinge. vor allem, weil der optimierer kleine schleifen aufrollen kann und so.

    wenn zur compilezeit die dimensionen bekannt sind, dann müssen die auch als template-parameter verhackstückelt werden. so hab ich wenigstens meyers verstanden. ein hoch auf die compilerfehler. und nieder mit den laufzeitfehlern. unser besonderer gruß geht hierbei natürlich an die java-fraktion.

    aber es tut ja keiner sagen, daß die ganzen template-instanzen code erzeugen müssen. wie wär's damit, daß sie nur leere wrapper um die ganz normale eine und einzige matrixklasse mit erst zur leufzeit bekannter größe sind? dann hättn wir, solange größen zur compilezeit bekannt sind, auch größenprüfungen zur compilezeit (und erst gar kein .invert() auf nichtquadratischen matrizen, statt ner exception (gruß)).
    es werden übrigens viel zu selten expression templates verwendet. die drängen sich mir hier wiedermal furchtbar auf.



  • MaSTaH schrieb:

    volkard schrieb:

    vector<vector<double>> liegt nicht in deinem sinne, denn jeder einzelne der untervektoren braucht nicht ne eigene größe zu haben.

    Dafür spräche aber, dass man so den mysteriösen [][]-"Operator" hätte. Andererseits könnte man ja auch () überladen. Sieht aber imho nicht wirklich nach Matrix aus wenn man sagt matrix(10, 2). Da finde ich matrix[10][2] schöner.

    das geheimnis um den myteriösen op[][] sollte inzwischen bereits der allgemeinheit bekanntgegeben worden sein. falls nicht, dann veröffentliche ich es hiermit:

    class Vector2D
    {//ungetestet
    private:
       Vector data;//der macht copy-ctor, dtor und op=
    public:
       class Zeilenproxy
       {
          private:
             Vector2D& v2d;
             int zeile;
          public:
             Zeilenproxy(Vector2D& _v2d,int _y)
             :v2d(_v2d),y(_y)
             {
             }
             double& operator[](int x)
             {
                return v2d.data[y*SIZEX+x];//kacke, nur demo
             }
       }
       ZeilenProxy operator[](int y)
       {
          return Zeilenproxy(*this,y);
       }
    };
    

    naheliegende verbesserungen:
    - const einbasteln
    - allein den proxy-trick zur aufgabe von Array2D machen. die implemetierung als template-parameter, die nen op()(int,int) hat.

    gibts eigentlich irgend nen brühmten, der immer sagt "eine klasse soll nur einen zweck haben", damit ich einen zum zitieren hätte?



  • volkard schrieb:

    das geheimnis um den myteriösen op[][] sollte inzwischen bereits der allgemeinheit bekanntgegeben worden sein. falls nicht, dann veröffentliche ich es hiermit:

    Also die Möglichkeit wäre mir nicht im Traum eingefallen. Thx für die Erleuchtung 👍 .



  • gibts eigentlich irgend nen brühmten, der immer sagt "eine klasse soll nur einen zweck haben"

    Einen? Es gibt wohl eher viele.
    Prinzipiell ist das ja nicht neu. Bereits bei Funktionen heitß die beste Kohäsion "functional cohesion", was soviel bedeutet wie: "performs one and only one operation".

    In der OOP gibt es sogar extra ein Prinzip dafür. Nennt sich Single Responsibility Principle (SRP) - "a class should have only one reason to change" (Robert C. Martin hat dazu ein schönes Kapitel geschrieben, dass man auf http://www.objectmentor.com/home findet)

    Wenn du explizit einen berühmten C++ Guru haben willst, kannst du z.B. Sutter zitieren, der in "Exceptional C++" schrieb:
    "Prefer cohesion. Always endeavor to give each piece of code- each module, each class, each function - a single, well-defined responsibility".



  • Könnt mir gar keine Klasse vorstellen die mehr als eine Aufgabe hat.

    Kennt jemand ein Beispiel?



  • Achso, in dem Paper sind Beispiele. Sorry. 😮


Anmelden zum Antworten