#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 по этим причинам.