首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xtensor中的懒惰求值

Xtensor中的懒惰求值
EN

Stack Overflow用户
提问于 2020-10-10 22:56:36
回答 1查看 110关注 0票数 1

在以下使用xtensor的函数中,我期望编译器将计算图表示为auto z = 3.0 * u + 100 * xt::cos(u);,并在xt::xtensor_fixed<T, xt::xshape<nn>> out = z;将表达式赋值给精确的张量时计算结果。

代码语言:javascript
复制
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);
}

但是,我发现了一个错误

代码语言:javascript
复制
views_xtensor.cpp:76:11: error: no viable overloaded '+='
        z += xt::cos(u);
[....]

我是不是用错了auto?如何在for-循环中使用惰性评估?

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-12 13:04:43

当你写

代码语言:javascript
复制
auto z = 3.0 * u

z的类型编码该操作,它类似于

代码语言:javascript
复制
xfunction<multiplies, scalar<double>, xtensor_fixed>

该类不包含任何值,因此不可能为其赋值(即使是计算的赋值)。现在,即使iw是可能的,请考虑下面的表达式

代码语言:javascript
复制
auto y = z + xt::cos(u);

这个表达式的类型类似于

代码语言:javascript
复制
xfunction<plus, type(z), xfunction<cos, xtensor_fixed>>

所以当你写

代码语言:javascript
复制
z += xt::cos(u); // equivalent to z = z + xt::cos(u);

您尝试为z分配一种完全不同类型的东西。

由于这些原因,延迟计算不能在for循环中使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64299071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档