Julia中数组元素的匹配

时间:2015-06-08 00:25:02

标签: julia

使用x = Any[[1,2],[2,3],[3,4],[4,5]],我尝试使用Julia0.4.0的以下行

x[ x .== [3,4] ]

但导致错误

ERROR: DimensionMismatch("arrays could not be broadcast to a common size")

我希望它能提供像Any[ [3,4] ]这样的东西,因为

x[3] == [3,4]   # => true

没问题。虽然此操作本身可能没用,但我想知道错误消息的含义。所以我很感激为什么会出现这种错误。

2 个答案:

答案 0 :(得分:5)

为了进行逐元素比较,Julia要求两个数组具有相同数量的元素。在这种情况下,可以通过理解来实现这一点:

julia> x = Any[[1,2],[2,3],[3,4],[4,5]]
4-element Array{Any,1}:
 [1,2]
 [2,3]
 [3,4]
 [4,5]

julia> x[x.==[[3,4] for i in 1:length(x)]]
1-element Array{Any,1}:
 [3,4]

所以我心中的问题是"为什么朱莉娅不会自动将[3,4]广播成这种形状?"。以下示例正确广播:

julia> y = [1,2,3,4]
4-element Array{Int64,1}:
 1
 2
 3
 4

julia> y.==3
4-element BitArray{1}:
 false
 false
  true
 false

julia> y[y.==3]
1-element Array{Int64,1}:
 3

似乎Julia的广播机制无法推断我们希望[3,4]广播到[[3,4],[3,4],[3,4],[3,4]]而不是其他形状的数组。

答案 1 :(得分:3)

你可以通过编写这样的比较来帮助Julia解决如何广播第二个变量的问题:

julia> x .== Any[[3, 4]]

你按预期得到BitArray:

4-element BitArray{1}:
 false
 false
  true
 false

因此,使用比较结果进行索引也是有效的:

julia> x[ x .== Any[[3,4]] ]
1-element Array{Any,1}:
 [3,4]