Chciałbym użyć biblioteki macierzy Eigen jako silnika algebry liniowej w moim programie. Eigen wykorzystuje szablony wyrażeń, aby przeprowadzić leniwą ocenę i uprościć pętle i obliczenia.Jak zintegrować bibliotekę korzystającą z szablonów wyrażeń?
Na przykład:
#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;
}
Ponieważ Eigena pomocą szablonów ekspresyjne kod jak
u = 2*v + w + 0.2*z;
W wyżej wymienionej próbie zmniejsza się do jednej pętli o długości 10 (nie 40, pływaki są wprowadzane do rejestratora według fragmentów 4) bez tworzenia tymczasowego. Jakie to jest świetne?
Ale jeśli zintegrować bibliotekę takiego:
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_;
}
Następnie wyrażenia takie jak:
UsingEigen a, b, c, d;
a = b + c + d;
nie może skorzystać z drogi Eigen jest realizowany. I to nie jest ostatnia z nich. Istnieje wiele innych przykładów, w których szablony ekspresji są używane w Eigen.
Proste rozwiązanie nie byłoby zdefiniowanie operatorów przez siebie, sprawi data_
publicznego i po prostu napisać wyrażeń takich jak:
UsingEigen a, b, c, d;
a.data_ = b.data_ + c.data_ + d.data_;
To łamie hermetyzację, ale zachowuje sprawność Eigen.
Innym sposobem może być tworzenie własnych operatorów, ale niech zwrócą szablony wyrażeń. Ale ponieważ jestem początkującym w C++, nie wiem, czy to jest właściwa droga.
Przykro mi, jeśli pytanie ma zbyt ogólny charakter. Jestem początkującym i nie mam ochoty pytać. Do tej pory używałem wszędzie std::vector<float>
, ale teraz potrzebuję również użyć macierzy. Przejście z std::vector<float>
na Eigena w całym moim projekcie to duży krok i obawiam się, że na początku popełnię błąd. Wszelkie rady są mile widziane!
Interesujący problem. Pierwszą rzeczą jest: dlaczego w ten sposób chcesz hermetyzować wektory biblioteki własnej? Jakie zachowanie dodają twoje klasy? –
Moje klasy nie dodają żadnej funkcjonalności do klas bibliotek własnych, ale ich używają. Na przykład jedna z moich podstawowych klas przechowuje dwa wektory. Jeden jako dane wejściowe do pewnych obliczeń matematycznych, a drugi jako wynik. Obiekty te muszą współpracować w podobny sposób, jak wspomniałem powyżej. Po dodaniu dwóch takich obiektów należy dodać dane wejściowe. –
Nie sądzę, że jest to możliwe bez samodzielnego reprodukowania znacznej części samego szablonu wyrażenia. Na przykład, '(a + b) * c' będzie mieć postać' ExprCwiseAdd * UsingEigen' (nazwa jest wymyślona, nie przywołuj jej więcej) i musi być gdzieś 'ExprCwiseAdd * UsingEigen' zdefiniowany gdzieś , ale także 'ExprCwiseAdd * ExprCWiseAdd' i tak dalej. W skrócie, dodanie nie będzie miało wartości "UsingEigen" jako typu zwracanego. (Możesz rzucić okiem na [boost :: proto] (http://www.boost.org/doc/libs/1_49_0/doc/html/proto.html), które jest ramą dla szablonów ekspresji). Powodzenia. – eudoxos