Julia 为什么生成器与2D理解中的理解不同

Julia 为什么生成器与2D理解中的理解不同,julia,for-comprehension,sequence-generators,Julia,For Comprehension,Sequence Generators,在以下表达式(版本0.6.2)中,一个生成一维数组的生成器和另一个生成二维数组的生成器之间的逻辑是什么 唯一的区别是用第二个表达式中的理解替换第一个表达式中的生成器。((i,j)表示1:2中的i表示3:4中的j) 而[(i,j)对于1:2中的i,3:4中的j]则通过最后的展平操作解析为表达式。表达式[(i,j)在1:2中表示i,在3:4中表示j]被收集到一个向量中,给出它的迭代器大小hashape,因此它在产品中表现良好 Base.iteratorsize(1:2中i的f(i,j)对于3:4中的

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

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

((i,j)表示1:2中的i表示3:4中的j)
[(i,j)对于1:2中的i,3:4中的j]
则通过最后的
展平操作解析为表达式。表达式
[(i,j)在1:2中表示i,在3:4中表示j]
被收集到一个向量中,给出它的
迭代器大小
hashape
,因此它在产品中表现良好

Base.iteratorsize(1:2中i的f(i,j)对于3:4中的j)
通常是
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)为I:2为j:3:4)
可以
hashape
,我将尝试将该行为添加到
扁平化中

谢谢您的解释!将
Base.iteratorsize(i的f(i,j)为1:2,j为3:4)更改为
hashape
似乎是正确的,但也会中断。那么
Base.iteratorsize((i,j)表示1:2中的i,如果为真,则为3:4中的j)
vs
Base.iteratorsize([(i,j)表示1:2中的i,如果为真,则为3:4中的j])
?顺便说一句,这两个
Base.iteratorsize([(i,show(0))对于1:2中的i])
Base.iteratorsize(((i,show(0))对于1:2中的i))
之间的差异也很有趣。@Liso和mschauer,如果收集一个产品理解总是会产生一个多维数组,那就太好了。当某些因素已达到一定程度时,使其有效可能存在一些问题,但表格强烈暗示了某种预期结果,满足预期会很好。对于矢量输出,平坦理解仍然可用。编辑:我研究过这个,它不容易实现。表达式
((i,j)在1:2中表示i在3:4中表示j)
大致相当于
flatte((j->(i,j)在3:4中表示j)(j)在1:2中表示i)
,flatte无法在收集之前查看匿名函数以计算其返回值的
长度。
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}: