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