如何在两个向量之间执行元素相减



我必须使用Vecs:vec_avec_b。两者大小相同。我想在两个向量之间执行元素相减,并将答案保存在第三个向量vec_c中。例如:

vec_a = [1, 2, 3]
vec_b = [0, 2, -3]
vec_c = vec_a - vec_b = [1, 0, 6]

我的解决方案是这个功能:

pub fn elementwise_subtraction(vec_a: Vec<i32>, vec_b: Vec<i32>) -> Vec<i32> {
let mut vec_c = Vec::new();
for i in 0..vec_a.len() {
vec_c.push(vec_a[i] - vec_b[i]);
}
vec_c
}

对于一个非常简单的操作,我觉得这有点冗长。有更好/更惯用的方法吗?

没有内置这样的东西,您必须自己实现或使用第三方机箱。

无论如何,您可以使用函数式编程继续改进您的代码:

pub fn elementwise_subtraction(vec_a: Vec<i32>, vec_b: Vec<i32>) -> Vec<i32> {
vec_a.into_iter().zip(vec_b).map(|(a, b)| a - b).collect()
}
let vec_a = vec![1, 2, 3];
let vec_b = vec![0, 2, -3];
let vec_c = elementwise_subtraction(vec_a, vec_b);
assert_eq!(vec_c, [1, 0, 6])

如果你想让它更通用(例如,同时接受切片或Vec,任何可减法类型(:

use std::ops::Sub;
pub fn elementwise_subtraction<N, IA, IB, F>(a: IA, b: IB) -> F
where
N: Sub,
IA: IntoIterator<Item = N>,
IB: IntoIterator<Item = N>,
F: FromIterator<N> + FromIterator<<N as Sub>::Output>,
{
a.into_iter().zip(b).map(|(a, b)| a - b).collect()
}
let vec_a = [1, 2, 3];
let vec_b = [0, 2, -3];
let vec_c: Vec<_> = elementwise_subtraction(vec_a, vec_b);
assert_eq!(vec_c, [1, 0, 6])

在操场上试试

您需要使用zipmap:

fn main() {
let vec_a = [1, 2, 3];
let vec_b = [0, 2, -3];
let vec_c: Vec<i32> = vec_a
.iter()
.zip(vec_b)
.map(|(elem_a, elem_b)| elem_a - elem_b)
.collect();
for elem_c in vec_c {
println!("{}", elem_c);
}
}

您的方法可能是最有效的方法,因为它使用了直接索引,但迭代器方法可能如下所示:

assert_eq!(
vec_a
.iter()
.zip(vec_b)
.map(|(a, b)| a - b)
.collect::<Vec<_>>(),
vec![1, 0, 6]
);

"更好";总是主观的,所以如果性能是你的首要任务,你应该对不同的方法进行基准测试;我以前对结果感到惊讶。

最新更新