如何计算一个向量与自身N次的笛卡尔积?



我正在寻找具有签名fn product(vector: &Vec<i32>, n: &i32) -> Vec<Vec<i32>>或类似功能的函数。一个例子:

assert_eq!(
product(vec![1, 2, 3, 4], 2),
[
[1, 1],
[1, 2],
[1, 3],
[1, 4],
[2, 1],
[2, 2],
[2, 3],
[2, 4],
[3, 1],
[3, 2],
[3, 3],
[3, 4],
[4, 1],
[4, 2],
[4, 3],
[4, 4]
],
)

我已经尝试使用iproductitertools箱:

use itertools::iproduct; // 0.10.0
fn product(vector: &Vec<i32>, n: &i32) -> Vec<Vec<i32>> {
let mut result = Vec::new();
for _ in 0..*n {
result = iproduct!(result.iter(), vector.iter()).collect();
}
result
}

产生以下错误:

error[E0277]: a value of type `Vec<_>` cannot be built from an iterator over elements of type `(&_, &i32)`
--> src/lib.rs:7:58
|
7 |         result = iproduct!(result.iter(), vector.iter()).collect();
|                                                          ^^^^^^^ value of type `Vec<_>` cannot be built from `std::iter::Iterator<Item=(&_, &i32)>`
|
= help: the trait `FromIterator<(&_, &i32)>` is not implemented for `Vec<_>`

如何解决这个问题?

  1. 您究竟期望result是什么类型?如果它是返回值,它必须是Vec<Vec<i32>>,对吗?但随后iproduct!(result.iter(), vector.iter())返回Iterator<Item = (&Vec<i32>, &i32)>(通过显式指定result的类型可以看到),并将Vec<(&Vec<i32>, &i32)>分配给result,这是行不通的。因此,您需要先将map(&Vec<i32>, &i32)转换为Vec<i32>

  2. 开始时,result是空的,所以它与任何东西的乘积都是空的。它需要包含一个元素。这个元素应该是什么?

  3. 参考n没有什么意义;类似地,更倾向于接受&[i32]片而不是&Vec<i32>

如果你修复了所有这些,你得到

S  
o  
m  
e  
s  
p  
o  
i  
l  
e  
r  
s  
p  
a  
c  
e  
f
o
r
y
o
u
t
o
t
r
y
y
o
u
r
s
e
l
f

游乐场

use itertools::iproduct;
fn product(vector: &[i32], n: i32) -> Vec<Vec<i32>> {
let mut result: Vec<Vec<i32>> = vec![vec![]];
for _ in 0..n {
result = iproduct!(result.iter(), vector.iter())
.map(|(v, x)| {
let mut v1 = v.clone();
v1.push(*x);
v1
})
.collect();
}
result
}

我会用flat_map而不是自己用iproduct

相关内容

  • 没有找到相关文章

最新更新