Я хотел бы использовать библиотеку 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;
}
Так как Eigen использует шаблоны выражений, код типа
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. И это не последнее. Существует много других примеров, в которых шаблоны экспрессии используются в Eigen.
Легким решением было бы не определять операторы самостоятельно, сделать data_
общедоступным и просто писать выражения, например:
UsingEigen a, b, c, d;
a.data_ = b.data_ + c.data_ + d.data_;
Это разрушает инкапсуляцию, но сохраняет эффективность Eigen.
Другим способом может быть создание собственных операторов, но пусть они возвращают шаблоны выражений. Но так как я новичок в С++, я не знаю, правильно ли это сделать.
Прошу прощения, если вопрос носит слишком общий характер. Я новичок, и мне не о чем спросить. До сих пор я использовал std::vector<float>
всюду, но теперь мне также нужно использовать матрицы. Переход от std::vector<float>
к Eigen во всем моем проекте - большой шаг, и я боюсь ошибиться в самом начале игры. Любые советы приветствуются!