在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
和的所有组合?
在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
和的所有组合?
马特的答案是好的,但我想提供使用数组理解的选择:
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
在我看来,阵列的理解往往更容易阅读,比broadcast
和reshape
更加灵活。
是的,重塑y
,使它正交于x
。 .
矢量化使用broadcast
来完成其工作。我把它想象成在所有其他维度上“挤压”单体尺寸。
这意味着,对于矢量x
和y
,你可以简单地重塑他们的一个评价x
和y
所有组合的产品:
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
跨越列,因为它被转置为单行矩阵。
还应该注意''reshape'创建一个视图,因此不会创建一个临时数组。所以在做这件事时不用担心性能。 –
有没有什么理由比'func(x,y。')更喜欢这个,或者在这种情况下是'x。+ y.''?移调也创建一个视图。 **编辑:**糟糕,它只在0.6版本上,在0.5你必须使用重塑,但在这种情况下,内存使用应该不重要。 – DNF
是的。现在,转置和ctranspose不适用于非数字元素的数组。谢天谢地,这看起来可能会改变。 –
同意!这绝对更可读。 –
谢谢!在可读性方面,这看起来更好,但都很好 – sholi