1

在使用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 循环中使用惰性求值?

感谢您的帮助!

4

1 回答 1

2

当你写

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 循环中使用惰性求值。

于 2020-10-12T13:04:43.337 回答