c ++ Как сгладить представление из xtensor, без глубокого копирования? - PullRequest
2 голосов
/ 18 марта 2019

Возможно ли прямое выравнивание вида из 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 Ответ

2 голосов
/ 19 марта 2019

Это похоже на ошибку, не могли бы вы открыть вопрос по репозиторию xtensor , пожалуйста?

Также вы можете инициализировать свой первый тензор в одной строке и избежать копирования:

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