Я хотел бы использовать библиотеку матриц 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.
Другим способом может быть создание собственных операторов, но пусть они возвращают шаблоны выражений. Но так как я новичок в C++, я не знаю, правильный ли это путь.
Извините, если вопрос носит слишком общий характер. Я новичок и спросить не у кого. До сих пор я везде использовал std::vector<float>
, но теперь мне нужно использовать и матрицы. Переход с std::vector<float>
на Eigen во всем моем проекте — большой шаг, и я боюсь сделать неверный вызов в самом начале. Любые советы приветствуются!
(a+b)*c
будет что-то вродеExprCwiseAdd*UsingEigen
(название выдумано, больше не вспоминайте), аExprCwiseAdd*UsingEigen
должно быть где-то определено, но также иExprCwiseAdd*ExprCWiseAdd
и так далее. Короче говоря, у дополнения не будетUsingEigen
в качестве возвращаемого типа. (Вы можете взглянуть на boost::proto который является основой для шаблонов выражений). Удачи. - person eudoxos   schedule 11.06.2012Eigen
и используют только ваши оболочки в качестве соответствующих входных и выходных данных. Затем промежуточные шаги используют фактическиеEigen
данные. И вам не нужно раскрывать переменные, вы можете использовать функции, которые возвращают (например) ссылки на классы. Правда, это все еще выставляет данные. Я чувствую твою боль. - person Konrad Rudolph   schedule 11.06.2012