具有广播尺寸灵活性的For循环

时间:2017-04-29 00:27:11

标签: julia

借助广播,以下代码将起作用,无论xyz是标量,大小为n的向量,还是其任意组合。

b = zeros(n)
b .= x.*y.*z .+ x

但是,我喜欢for循环。仅当x是大小为n的向量,y为标量且z为标量时,以下for循环才有效。

for i = 1:n
    b[i] = x[i]*y*z + x[i]
end

要为任何情况编写等效的b .= x.*y.*z .+ x作为for循环,我只能考虑为xy和{的每个组合编写for循环。 if语句中的{1}}。在更复杂的数学表达式中,这可能会使更多变量变得混乱。

与使用许多if语句相比,是否有更优雅的方式来做我喜欢的事情?

1 个答案:

答案 0 :(得分:5)

您可以定义一个包装器类型,如果包装变量是数组,则索引它将给出数组索引,并为标量的所有索引重复相同的值。我在下面有一个例子,但它可能没有使用broadcast那么有效。并且它不检查数组长度是否一致。但是,自定义包装类型可以缓解这种情况。

julia> function f(x,y,z)
           lx,ly,lz = length(x),length(y),length(z)
           maxlen = max(lx,ly,lz)
           cx = cycle(x)
           cy = cycle(y)
           cz = cycle(z)
           b = zeros(maxlen)
           @inbounds for (xi,yi,zi,i) in zip(cx,cy,cz,1:maxlen)
               b[i] = xi*yi*zi+xi
           end
           return b
       end
f (generic function with 1 method)

julia> f(1:3,21,2)
3-element Array{Float64,1}:
  43.0
  86.0
 129.0