微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xtensor中的惰性评估

如何解决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 举报,一经查实,本站将立刻删除。