отложенная оценка в Xtensor

#c #lazy-evaluation #xtensor

#c #отложенная оценка #xtensor

Вопрос:

В следующей функции, использующей xtensor, я ожидал, что компилятор выразит график вычислений auto z = 3.0 * u 100 * xt::cos(u); и оценит результат xt::xtensor_fixed<T, xt::xshape<nn>> out = z; при присвоении выражения точному тензору.

 template<typename T, size_t nn>
T func_cos(xt::xtensor_fixed<T, xt::xshape<nn>> amp;u) {

    auto z = 3.0 * u;
    for (auto k = 0; k < 100;   k){
        z  = xt::cos(u);
    }
    xt::xtensor_fixed<T, xt::xshape<nn>> out = z;
    return out(0);
}
  

Однако я получил сообщение об ошибке

 views_xtensor.cpp:76:11: error: no viable overloaded ' ='
        z  = xt::cos(u);
[....]
  

Я auto неправильно использовал? Как я мог бы использовать отложенную оценку в цикле for?

Спасибо за вашу помощь!

Комментарии:

1. error: no viable overloaded Не могли бы вы опубликовать все связанные сообщения об ошибках, включая все note: сообщения и другие из вашего компилятора?

Ответ №1:

Когда вы пишете

 auto z = 3.0 * u
  

Тип z кодирует операцию, это что-то вроде

 xfunction<multiplies, scalar<double>, xtensor_fixed>
  

Этот класс не содержит никакого значения, поэтому ему невозможно присвоить что-либо (даже если это вычисленное присвоение). Теперь, даже если iw был возможен, рассмотрим следующее выражение

 auto y = z   xt::cos(u);
  

Тип этого выражения выглядит примерно так

 xfunction<plus, type(z), xfunction<cos, xtensor_fixed>>
  

Поэтому, когда вы пишете

 z  = xt::cos(u); // equivalent to z = z   xt::cos(u);
  

Вы пытаетесь назначить z что-то совершенно другого типа.

Отложенная оценка не может использоваться в циклах for по этим причинам.