Ich würde gerne die Eigen-Matrix-Bibliothek als lineare Algebra-Engine in meinem Programm verwenden. Eigen verwendet Expressionsvorlagen, um eine verzögerte Auswertung zu implementieren und Schleifen und Berechnungen zu vereinfachen.Wie integriert man eine Bibliothek, die Expression-Templates verwendet?
Zum Beispiel:
#include<Eigen/Core>
int main()
{
int size = 40;
// VectorXf is a vector of floats, with dynamic size.
Eigen::VectorXf u(size), v(size), w(size), z(size);
u = 2*v + w + 0.2*z;
}
Da Eigen Expressionsschablonen verwendet, Code wie
u = 2*v + w + 0.2*z;
In der oben erwähnten Probe auf eine einzige Schleife der Länge reduziert 10 (nicht 40, ist der Schwimmer setzen durch 4) in Register eintragen, ohne ein temporäres zu erzeugen. Wie cool ist das?
Aber wenn ich integrieren, um die Bibliothek wie folgt aus:
class UsingEigen
{
public:
UsingEigen(const Eigen::VectorXf& data):
data_(data)
{}
UsingEigen operator + (const UsingEigen& adee)const
{
return UsingEigen(data_ + adee.data_);
}
...
private:
Eigen::VectorXf data_;
}
Dann werden die Ausdrücke wie:
UsingEigen a, b, c, d;
a = b + c + d;
kann nicht die Vorteile der Art und Weise nehmen Eigen umgesetzt wird. Und das ist nicht das letzte davon. Es gibt viele andere Beispiele, in denen Expression-Templates in Eigen verwendet werden.
Die einfache Lösung wäre nicht die Betreiber selbst zu definieren, schreibt data_
öffentlich zu machen und nur Ausdrücke wie:
UsingEigen a, b, c, d;
a.data_ = b.data_ + c.data_ + d.data_;
Dies bricht Verkapselung, aber es, die Effizienz des Eigens bewahrt.
Andere Möglichkeit könnte sein, meine eigenen Operatoren zu erstellen, aber sie sollen Expression-Templates zurückgeben. Aber da ich ein Anfänger in C++ bin, weiß ich nicht, ob das der richtige Weg ist.
Es tut mir leid, wenn die Frage zu allgemeiner Natur ist. Ich bin ein Anfänger und habe niemanden zu fragen. Bis jetzt habe ich überall std::vector<float>
benutzt, aber jetzt muss ich auch Matrizen verwenden. In meinem gesamten Projekt von std::vector<float>
zu Eigen zu wechseln, ist ein großer Schritt und ich habe Angst, gleich zu Beginn einen falschen Anruf zu machen. Jeder Rat ist willkommen!
Interessantes Problem. Die erste Sache ist jedoch: Warum wollen Sie die Eigenbibliotheksvektoren auf diese Weise kapseln? Welches Verhalten fügen deine Klassen hinzu? –
Meine Klassen fügen den Eigenbibliotheksklassen selbst keine Funktionalität hinzu, sondern verwenden sie. Zum Beispiel speichert eine meiner Kernklassen zwei Vektoren. Eins als Eingabe für eine bestimmte mathematische Berechnung und das andere als Ausgabe. Diese Objekte müssen auf ähnliche Weise zusammenarbeiten, wie ich oben erwähnt habe. Wenn Sie zwei solche Objekte hinzufügen, sollten die Eingaben hinzugefügt werden. –
Ich glaube nicht, dass dies möglich ist, ohne einen wesentlichen Teil des Expression-Template-Frameworks selbst zu reproduzieren. Zum Beispiel ist '(a + b) * c 'so etwas wie' ExprCwiseAdd * UsingEigen' (der Name ist erfunden, erinnere mich nicht mehr daran), und es muss irgendwo 'ExprCwiseAdd * UsingEigen' definiert sein , aber auch 'ExprCwiseAdd * ExprCWiseAdd' und so weiter. Kurz gesagt, der Zusatz wird nicht 'UsingEigen' als Rückgabetyp haben. (Sie können sich [boost :: proto] (http://www.boost.org/doc/libs/1_49_0/doc/html/proto.html) ansehen, welches ein Framework für Expression-Templates ist). Viel Glück. – eudoxos