首页 > 解决方案 > 如何在 Julia 中广播集合数组的集合操作?

问题描述

我正在尝试在给定集合y和某些集合数组中的所有项目之间执行集合操作X,如下所示:

X=Array{Set}([Set([1,2,1]), Set([4,6,8 ]), Set([4,5])]) 
y=Set{Int16}([2,8,4])
z=broadcast(intersect, y, X)

println(z)

对于我的示例,这给了我空集,而不是带有单例的集y

标签: julia

解决方案


您必须防止y被迭代。通常你会得到一个错误,但不幸的y是有三个元素以及 vector X。让我们创建一个更大的向量然后看看问题:

julia> X=Array{Set}([Set([1,2,1]), Set([4,6,8 ]), Set([4,5]), Set([7])])
4-element Array{Set,1}:
 Set([2, 1])
 Set([4, 8, 6])
 Set([4, 5])
 Set([7])

julia> y=Set{Int16}([2,8,4])
Set{Int16} with 3 elements:
  4
  2
  8

julia> z=broadcast(intersect, y, X)
ERROR: DimensionMismatch("arrays could not be broadcast to a common size; got a dimension with lengths 3 and 4")

如何解决它 - 包装y在一个 0 维容器中,Ref(y)如下所示:

julia> z=broadcast(intersect, Ref(y), X)
4-element Array{Set{Int16},1}:
 Set([2])
 Set([4, 8])
 Set([4])
 Set()

或者等效地写:

julia> z=intersect.(Ref(y), X)
4-element Array{Set{Int16},1}:
 Set([2])
 Set([4, 8])
 Set([4])
 Set()

推荐阅读