xtensor:将视图赋值为double



我试图通过xtensor库实现滚动均值alapandas。然而,我无法将表达式xt::mean(x_window)分配给双result[i]

#include <iostream>
#include <xtensor/xarray.hpp>
#include <xtensor/xio.hpp>
#include <xtensor/xview.hpp>
#include <xtensor/xadapt.hpp>
#include <vector>
// implement rolling mean
template<typename T>
xt::xarray<T> rolling_mean(const xt::xarray<T> &x, const int window) {
const auto nan = std::numeric_limits<T>::quiet_NaN();
xt::xarray<T> result = xt::full_like(x, nan);
for (int i = 0; i < x.shape()[0] - window + 1; i++) {
auto x_window = xt::view(x, xt::range(i, i + window));
result[i + window - 1] = xt::mean(x_window); // <-- problematic step
}
return result;
}
int main(int argc, char *argv[]) {
using T = double;
std::vector<T> v = {1, 2, 3, 4, 5};
xt::xarray<T> a = xt::adapt(v);
std::cout << rolling_mean(a,2) << std::endl; // [nan, 1.5, 2.5, 3.5, 4.5] expected
}

如何解决这个问题?

编译失败,并显示错误消息

error: assigning to 'double' from incompatible type 'xt::xfunction<xt::detail::divides, xt::xreducer<xt::xreducer_functors<xt::detail::plus, xt::const_value<double>>, const xt::xview<xt::xarray_container<xt::uvector<double, xsimd::aligned_allocator<double, 16>>, xt::layout_type::row_major, xt::svector<unsigned long, 4, std::allocator<unsigned long>, true>> &, xt::xrange<long>> &, xt::svector<unsigned long, 4, std::allocator<unsigned long>, true>, xt::reducer_options<double, std::tuple<xt::evaluation_strategy::lazy_type>>>, xt::xscalar<double>>'

问题你实际上并没有调用xt::mean的可调用结果,而是试图将xt::mean的结果赋值给double

这只是通过添加括号()来调用它,然后将其分配给double,如下所示:

//----------------------------vv---->added this parenthesis
result[i] = xt::mean(x_window)();

最新更新