在以下使用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循环中使用惰性评估。