在以下使用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-循环中使用惰性评估?
谢谢你的帮助!
发布于 2020-10-12 13:04:43
当你写
auto z = 3.0 * uz的类型编码该操作,它类似于
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循环中使用。
https://stackoverflow.com/questions/64299071
复制相似问题