Я хотел бы использовать библиотеку матриц 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
, но теперь мне нужно использовать и матрицы.Переход с std::vector
на Eigen во всем моем проекте — большой шаг, и я боюсь сделать неправильный вызов в самом начале. Любые советы приветствуются!