Я хотел бы использовать библиотеку Eigen-матрицы в качестве механизма линейной алгебры в своей программе. Eigen использует шаблоны выражений для реализации ленивой оценки и упрощения циклов и вычислений.Как интегрировать библиотеку, которая использует шаблоны выражений?
Например:
#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;
}
Поскольку Эйген использует шаблоны экспрессии, подобный код
u = 2*v + w + 0.2*z;
В вышеупомянутом образце сводится к одной петле длины 10 (не 40, поплавки ставятся в реестре кусками 4) без создания временного. Как это круто?
Но если я интегрировать библиотеку так:
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_;
}
Тогда выражения, как:
UsingEigen a, b, c, d;
a = b + c + d;
не может воспользоваться способом Эйген реализуется. И это не последнее. Существует много других примеров, в которых шаблоны экспрессии используются в Eigen.
Простое решение было бы не определять операторы самостоятельно, сделать data_
общественности и просто писать такие выражения, как:
UsingEigen a, b, c, d;
a.data_ = b.data_ + c.data_ + d.data_;
Это нарушает инкапсуляцию, но сохраняет эффективность Эйгена.
Другим способом может быть создание собственных операторов, но пусть они возвращают шаблоны выражений. Но поскольку я новичок в C++, я не знаю, правильно ли это.
Прошу прощения, если вопрос носит слишком общий характер. Я новичок, и мне не о чем спросить. До сих пор я использовал std::vector<float>
везде, но теперь мне также нужно использовать матрицы. Переключение с std::vector<float>
на Eigen во всем моем проекте - большой шаг, и я боюсь ошибиться в самом начале игры. Любые советы приветствуются!
Интересная проблема. Однако первое: почему вы хотите инкапсулировать векторы Eigen библиотеки таким образом? Какое поведение добавляются вашими классами? –
Мои классы не добавляют функциональности самим классам библиотеки Eigen, но используют их. Например, один из моих основных классов хранит два вектора. Один - как вход для определенного математического вычисления, а другой как вывод. Эти объекты должны взаимодействовать так же, как я упоминал выше. Когда вы добавляете два таких объекта, входы должны быть добавлены. –
Я не думаю, что это возможно без ретрансляции значительной части рамки шаблона выражения. Например, '(a + b) * c' будет чем-то вроде' ExprCwiseAdd * UsingEigen' (имя составлено, не напомните об этом больше), и там должно быть 'ExprCwiseAdd * UsingEigen', определенном где-то , но также «ExprCwiseAdd * ExprCWiseAdd» и т. д. Короче говоря, добавление не будет иметь 'UseEigen' в качестве возвращаемого типа. (Вы можете взглянуть на [boost :: proto] (http://www.boost.org/doc/libs/1_49_0/doc/html/proto.html), который является основой для шаблонов выражений). Удачи. – eudoxos