如何在Julia中的集合数组上广播集合操作?

如何在Julia中的集合数组上广播集合操作?,julia,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中有单例的集。您必须保护y不被迭代。通常会出现错误,但不幸的是y有三个元素以及向量X。让我们创建一个更大的向量,然后看看问题: julia> X=Ar

我试图在给定集合
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
中有单例的集。

您必须保护
y
不被迭代。通常会出现错误,但不幸的是
y
有三个元素以及向量
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
包装在带有
Ref(y)
的0维容器中,如下所示:

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()

谢谢@Bogumil Kaminski,这解决了我的问题。编写
Array{Set}(…)
通常不是一个好主意。这会将数组转换为具有抽象元素类型的向量
[Set([1,2,1])、Set([4,6,8])、Set([4,5])]
具有类型
数组{Set{Int64},1}
,但您将其转换为抽象的eltype
数组{Set,1}
。这可能会影响性能。@DNF,谢谢您的评论。我是Julia的新手,如果您能推荐另一种有效的方法,我将不胜感激。只需编写
X=[Set([1,2,1])、Set([4,6,8])、Set([4,5])]
,然后让Julia找出类型。编写
Set(Int16[2,8,4])
也比编写
Set{Int16}([2,8,4])
稍微好一些,因为后者首先创建
Int64
的向量,然后将其转换为
Int16
,而前者直接创建
Int16
s。但是我想知道你为什么在这里使用
Int16
。谢谢@DNF。没有理由使用Int16,我只是试图通过指定一个类型来纠正错误,但由于您的评论,我现在知道了一些额外的细节。