我正在使用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());
});
有没有办法避免在这里复制?
更新:
现在我认为这是一个愚蠢的问题。无法进行此转换,因为如果不创建&T
就无法拥有T
。显然,如果不保留对基础数据的所有权,就无法创建Array2<u8>
。我自欺欺人地认为应该可行,因为ArrayView
和&Array
都不拥有数据。
答案 0 :(得分:1)
否,您无法获得&Array2<u8>
,因为&Array2<u8>
始终是对完整2d数组的引用,而您的layer
包含其他元数据来标识正确的2d数组拥有的Array2
。
但是,您可以采用另一种方法:使use_array
取ArrayView2<u8>
(如果它不是您依赖的某些外部代码的一部分),然后更改以前调用的任何调用use_array
,其中包含对use_array(your_array2.view())
的完整二维数组引用。