我有一个很大的Vec<u8>,代表一个灰色图像的原始像素值.因为像素格式实际上是16位宽,所以两个u8就是一个像素.

现在我想使用图像as if,它是8位宽的,所以我只取像素中较高的8位部分.

作为一个例子,给定一个原始vec v = vec![0,1,2,3,4,5],我如何通过步骤2将其查看到引用view : &[u8](而不需要将它们复制到新的Vec中,以获得性能),使得view可以等效于&[0,2,4].非常感谢

推荐答案

您所要求的东西是不可能的,因为根据定义,存储片是连续的内存块.要得到一个&[0u8, 2, 4],你需要有一个等于[0u8, 2, 4]的东西,也就是说,这三个字节正好紧挨着彼此定位.

你的conceptually要求的东西看起来像stride,也就是说,它会产生一系列元素,但会跳过其中的一些元素.这可以使用迭代器相对容易地完成,例如,like this:

fn only_first_byte_from_pair<'a>(data: &'a [u8]) -> impl Iterator<Item = u8> + 'a {
    return data.chunks(2).map(|chunk| chunk[0])
}

或者,您可以查看ndarray,它具有开箱即用的相关功能,但对于实际任务来说可能有点太复杂了.

Rust相关问答推荐

捕获Rust因C++异常而产生panic

将已知大小的切片合并成一个数组,

我如何在Rust中使用传递依赖中的特征?

如何在 struct 的自定义序列化程序中使用serde序列化_WITH

像这样的铁 rust 图案除了‘选项’之外,还有其他 Select 吗?

避免在Collect()上进行涡鱼类型的涂抹,以产生<;Vec<;_>;,_>;

Rust函数的返回值不能引用局部变量或临时变量

我们能确定Rust会优化掉Clone()吗?如果它会立即掉落?

在macro_rule中拆分模块和函数名

允许 rust 迹 struct 条目具有多种类型

为什么HashMap::get和HashMap::entry使用不同类型的密钥?

如何在 Rust 中将函数项变成函数指针

如何判断服务器是否正确接收数据

打印 `format_args!` 时borrow 时临时值丢失

切片不能被 `usize` 索引?

判断 is_ok 后重用结果

在 Rust 中返回对枚举变体的引用是个好主意吗?

Rust 中的通用 From 实现

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

如何在不设置精度的情况下打印浮点数时保持尾随零?