c ++如何在不进行深度复制的情况下从xtensor展平视图?

时间:2019-03-18 19:59:46

标签: c++ 3d xtensor

是否可以直接从xtensor展平视图? 像这样:

xt::xarray<double> arr3d = xt::linspace<double>(1.0, 21970.0, 21970);
arr3d.reshape({13, 13, 130});
xt::xtensor<double, 3> data = arr3d;

xt::xtensor<double, 3>  data_view = xt::view(data, xt::range(9, 12),xt::range(9, 12),xt::range(9, 12));
xt::xtensor<double, 1>  flat_data = xt::flatten(data_view);

如果我尝试直接展平视图,结果会有所不同。

xt::xtensor<double, 1>  flat_data = xt::flatten(xt::view(data, xt::range(9, 12),xt::range(9, 12),xt::range(9, 12)));

我正在考虑直接扁平化,以获得更干净和优化的代码。有办法吗?还是应该在展平视图之前将视图复制到辅助变量?

糟糕: 直接展平输出(错误答案):
16390、16391、16392、16393、16394、16395、16396、16397、16398、16399、16400、16401、16402、16403、16404、16405、16406、16407、16408、16409、16410、16411、16412、16413、16414, 16415、16416。

在展平前复制输出我需要的内容(内核窗口): 16390,16391,16392,16520,16521,16522,16650,16651,16652,18080,18081,18082,18210,18211,18212,18340,18341,18342,19770,19771,19772,19900,19901,19902,20030, 20031、20032

1 个答案:

答案 0 :(得分:2)

这看起来像是个错误,您可以在xtensor's repo上打开一个问题吗?

此外,您可以在一行中初始化第一个张量并避免复制:

xt::xtensor<double, 3> = xt::linspace<double>(1.0, 21970.0, 21970).reshape({13, 13, 130});