gpt4 book ai didi

rust - 我可以用迭代器做到这一点吗?

转载 作者:行者123 更新时间:2023-12-03 11:26:18 27 4
gpt4 key购买 nike

您好,我写了一个将向量映射到区间 [0,1] 的函数:

fn vec2interval(v: &Vec<f32>) -> Vec<f32> {
let total: f32 = v.iter().sum();
let mut interval: Vec<f32> = vec![0f32; v.len()];
interval[0] = v[0] / total;
for i in 1..v.len() {
interval[i] = interval[i-1] + v[i] / total;
}
return interval;
}

有什么方法可以对迭代器做同样的事情吗?我写了以下内容,但速度较慢并且需要 for 循环:

fn vec2interval(v: &Vec<f32>) -> Vec<f32> {
let total: f32 = v.iter().sum();
let mut interval: Vec<f32> = v
.iter()
.map(|x| x / total)
.collect::<Vec<f32>>();
for i in 1..v.len() {
interval[i] = interval[i-1] + interval[i];
}
return interval;
}

最佳答案

scan 可以完成所有工作:

fn vec2interval(v: &Vec<f32>) -> Vec<f32> {
let total: f32 = v.iter().sum();

v.iter()
.scan(0.0, |acc, x| {
*acc += x / total;
Some(*acc)
})
.collect()
}

此外,最好使用 slice ( &[u8] ) 而不是 Vec<_>作为参数。

关于rust - 我可以用迭代器做到这一点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62807530/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com