嗨,我写了一个函数,将向量映射到区间[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()
}
另外,&[u8]
最好使用slice()代替Vec<_>
参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句