Xtensor 中的惰性求值

lazy-evaluation in 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>> &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 循环中使用惰性求值?

感谢您的帮助!

写的时候

auto z = 3.0 * u

z的类型编码运算,类似于

xfunction<multiplies, scalar<double>, xtensor_fixed>

这个 class 没有任何值,所以不可能给它赋值(即使它是一个计算赋值)。现在即使 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 循环中使用惰性求值。