在以下使用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>
此类不包含任何值,因此无法为它分配任何值(即使它是计算的赋值)。现在,即使有可能使用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循环中使用惰性评估。

10-04 21:57