3

在以下表达式(版本 0.6.2)中,一个生成器生成一维数组和另一个生成二维数组之间的逻辑是什么:

julia> collect((a,b,c) for (a,b) in ((i,j) for i in 1:2 for j in 3:4), c in 5:6)
8-element Array{Tuple{Int64,Int64,Int64},1}:
 (1, 3, 5)
 (1, 4, 5)
 (2, 3, 5)
 (2, 4, 5)
 (1, 3, 6)
 (1, 4, 6)
 (2, 3, 6)
 (2, 4, 6)

julia> collect((a,b,c) for (a,b) in [(i,j) for i in 1:2 for j in 3:4], c in 5:6)
4×2 Array{Tuple{Int64,Int64,Int64},2}:
 (1, 3, 5)  (1, 3, 6)
 (1, 4, 5)  (1, 4, 6)
 (2, 3, 5)  (2, 3, 6)
 (2, 4, 5)  (2, 4, 6)

唯一的区别是用第二个表达式中的推导替换第一个表达式中的生成器。

4

1 回答 1

2

((i,j) for i in 1:2 for j in 3:4) 并被 [(i,j) for i in 1:2, j in 3:4]解析为带有最终flatten操作的表达式。表达式[(i,j) for i in 1:2, j in 3:4]被收集到一个向量中,iteratorsize HasShape因此它在产品中表现得很好。

Base.iteratorsize(f(i,j) for i in 1:2 for j in 3:4)通常是SizeUnknown 因为我们不知道产品中的返回类型f和操作符SizeUnknown使整个产品变得SizeUnknown平坦,因此在收集时是平坦的。

您可能还在寻找

julia> collect((a,b,c) for (a,b) in ((i,j) for i in 1:2, j in 3:4), c in 5:6)
2×2×2 Array{Tuple{Int64,Int64,Int64},3}

julia> collect((a,b,c) for (a,b) in [(i,j) for i in 1:2, j in 3:4], c in 5:6)
2×2×2 Array{Tuple{Int64,Int64,Int64},3}:

(在形成第一台发电机时不涉及展平,一切顺利)。

编辑:我认为现在Base.iteratorsize(f(i,j) for i in 1:2 for j in 3:4)可以HasShape,我会尝试将这种行为添加到flatten.

于 2017-12-02T08:09:13.743 回答