Как преобразовать ndarray :: ArrayView в & ndarray :: Array без копирования? - PullRequest
1 голос
/ 22 февраля 2020

Я использую ящик ndarray, и у меня есть функция, которая принимает ссылку на Array2:

fn use_array(array: &Array2<u8>) {
    // ...
}

Я пытаюсь вызвать эту функцию с видом:

image.axis_iter(Axis(2)).for_each(|layer| {
    fun(&layer.to_owned());
});

Это приводит к ошибке:

   |
92 |         fun(&layer);
   |             ^^^^^^ expected struct `ndarray::OwnedRepr`, found struct `ndarray::ViewRepr`
   |
error: could not compile `poisson-editing`.
warning: build failed, waiting for other jobs to finish...
   = note: expected type `&ndarray::ArrayBase<ndarray::OwnedRepr<u8>, ndarray::dimension::dim::Dim<[usize; 2]>>`
              found type `&ndarray::ArrayBase<ndarray::ViewRepr<&u8>, ndarray::dimension::dim::Dim<[usize; 2]>>`

Я могу решить ее, владея элементами массива, но затем я создаю ненужную копию массива.

image.axis_iter(Axis(2)).for_each(|layer| {
    use_array(&layer.to_owned());
});

Есть ли способ избежать копирования здесь?


Обновление:

Теперь я считаю это глупым sh вопросом. Это преобразование невозможно, потому что вы не можете получить &T без создания T. Очевидно, что невозможно создать Array2<u8> без сохранения прав собственности на базовые данные. Я заблуждаюсь, думая, что это возможно, потому что ArrayView и &Array не владеют данными.

1 Ответ

1 голос
/ 26 февраля 2020

Нет, вы не можете получить &Array2<u8>, потому что &Array2<u8> всегда является ссылкой на полный 2d массив, в то время как ваш layer содержит дополнительные метаданные для определения правильных разделов принадлежащего Array2, который доступны.

Однако вы могли бы сделать это наоборот: вы можете use_array взять ArrayView2<u8> (если это не часть какого-то внешнего кода, от которого вы зависите), а затем изменить любые вызовы, которые ранее назывался use_array с полной ссылкой на 2d массив use_array(your_array2.view()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...