在Rust中获取切片或Vec中最大或最小浮点值的索引的惯用方式是什么?

-该Vec<f32>不会 具有任何NaN价值或表现出任何NaN行为。

采取以下示例集:

0.28  

0.3102

0.9856

0.3679

0.3697

0.46

0.4311

0.9781

0.9891

0.5052

0.9173

0.932

0.8365

0.5822

0.9981

0.9977

获取上面列表中最大值(值可以为负)的 的最新颖,最稳定的方法是什么?

我最初的尝试是遵循以下思路:

let _tmp = *nets.iter().max_by(|i, j| i.partial_cmp(j).unwrap()).unwrap();    

let _i = nets.iter().position(|&element| element == _tmp).unwrap();

哪里nets&Vec<f32>。在我看来,这显然是不正确的。

等效的Python等效项(考虑了上述假设):

_i = nets.index(max(nets))

回答:

我可能会做这样的事情:

fn main() -> Result<(), Box<std::error::Error>> {

let samples = vec![

0.28, 0.3102, 0.9856, 0.3679, 0.3697, 0.46, 0.4311, 0.9781, 0.9891, 0.5052, 0.9173, 0.932,

0.8365, 0.5822, 0.9981, 0.9977,

];

// Use enumerate to get the index

let mut iter = samples.iter().enumerate();

// we get the first entry

let init = iter.next().ok_or("Need at least one input")?;

// we process the rest

let result = iter.try_fold(init, |acc, x| {

// return None if x is NaN

let cmp = x.1.partial_cmp(acc.1)?;

// if x is greater the acc

let max = if let std::cmp::Ordering::Greater = cmp {

x

} else {

acc

};

Some(max)

});

println!("{:?}", result);

Ok(())

}

这可以通过在Iterator上添加带有trait的特征来实现try_max_by

以上是 在Rust中获取切片或Vec中最大或最小浮点值的索引的惯用方式是什么? 的全部内容, 来源链接: utcz.com/qa/430332.html

回到顶部