rust - 我可以用迭代器做到这一点吗?
问题描述
嗨,我写了一个将向量映射到区间 [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<_>
作为参数。
推荐阅读
- java - 如何计算 ArrayList 中元素的单次出现?
- pandas - 方法='索引'时的熊猫插值类型?
- ruby-on-rails - 如何修复“找不到 gem railties 的可执行导轨。railties 当前不包含在捆绑包中”?
- sql - 组合查询,其中一个是递归的
- r - 在 tidyverse 的 styler 包中,style_text 首次运行时提示用户输入
- google-sheets - 基于列的自动填充数字
- sql - 以开玩笑的方式并行运行创建扩展的 sql 迁移会触发约束错误
- javascript - 如果包含 html 输入的 Div 被隐藏,则删除必需的属性
- docker - 让 `pipenv run` 运行多个命令
- html - 如果键盘显示,全屏背景自动调整大小