2017-03-16 85 views
6

在Julia中,具有点.的矢量化函数用于按元素操作。在Julia中评估具有矢量化函数的组合

运行f.(x)意味着f(x[1])f(x[2]),......依次执行

但是,假设我有一个函数,它接受两个参数,说g(x,y)

我想g(x[1],y[1])g(x[2],y[1])g(x[3],y[1]),... ,g(x[1],y[2]),g(x[2],y[2]),g(x[3],y[2]),...

有没有什么办法来评估x和的所有组合?

回答

5

马特的答案是好的,但我想提供使用数组理解的选择:

julia> x = 1:5 
     y = 10:10:50 
     [i + j for i in x, j in y] 
5×5 Array{Int64,2}: 
11 21 31 41 51 
12 22 32 42 52 
13 23 33 43 53 
14 24 34 44 54 
15 25 35 45 55 

在我看来,阵列的理解往往更容易阅读,比broadcastreshape更加灵活。

+1

同意!这绝对更可读。 –

+0

谢谢!在可读性方面,这看起来更好,但都很好 – sholi

5

是的,重塑y,使它正交于x.矢量化使用broadcast来完成其工作。我把它想象成在所有其他维度上“挤压”单体尺寸。

这意味着,对于矢量xy,你可以简单地重塑他们的一个评价xy所有组合的产品:

julia> x = 1:5 
     y = 10:10:50 
     (+).(x, reshape(y, 1, length(y))) 
5×5 Array{Int64,2}: 
11 21 31 41 51 
12 22 32 42 52 
13 23 33 43 53 
14 24 34 44 54 
15 25 35 45 55 

请注意,数组的形状的方向相匹配争论; x跨越行,并且y跨越列,因为它被转置为单行矩阵。

+1

还应该注意''reshape'创建一个视图,因此不会创建一个临时数组。所以在做这件事时不用担心性能。 –

+1

有没有什么理由比'func(x,y。')更喜欢这个,或者在这种情况下是'x。+ y.''?移调也创建一个视图。 **编辑:**糟糕,它只在0.6版本上,在0.5你必须使用重塑,但在这种情况下,内存使用应该不重要。 – DNF

+0

是的。现在,转置和ctranspose不适用于非数字元素的数组。谢天谢地,这看起来可能会改变。 –