如何解决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>
此类不包含任何值,因此无法给它分配任何值(即使它是计算的赋值)。现在,即使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
完全不同的类型。
由于这些原因,不能在循环中使用惰性求值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。