Julia 具有广播维度灵活性的For循环

Julia 具有广播维度灵活性的For循环,julia,Julia,借助广播,无论x、y和z是否为标量、大小为n的向量或其任何组合,以下代码都将起作用 b = zeros(n) b .= x.*y.*z .+ x 不过,我想要一个for循环。以下for循环仅在x是大小为n的向量,y是标量,z是标量时有效 for i = 1:n b[i] = x[i]*y*z + x[i] end 要将b.=x.*y.*z.+x的等价物作为任何情况下的for循环来编写,我只能考虑为if语句中的x、y和z的每个组合编写for循环。如果在更复杂的数学表达式中有更多的变量,

借助广播,无论
x
y
z
是否为标量、大小为
n
的向量或其任何组合,以下代码都将起作用

b = zeros(n)
b .= x.*y.*z .+ x
不过,我想要一个for循环。以下for循环仅在
x
是大小为
n
的向量,
y
是标量,
z
是标量时有效

for i = 1:n
    b[i] = x[i]*y*z + x[i]
end
要将
b.=x.*y.*z.+x
的等价物作为任何情况下的for循环来编写,我只能考虑为if语句中的
x
y
z
的每个组合编写for循环。如果在更复杂的数学表达式中有更多的变量,这可能会变得混乱


有没有一种比使用许多if语句更优雅的方法来完成我想做的事情?

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

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

使用宏或生成的函数。使用
广播有什么问题?把它作为一种语言特性的全部意义在于,你可以用一种既简洁又高效的方式来表达像这样复杂的事情。我想让它并行。谢谢!为什么这不如广播效率?这只是猜测。我没有比较准确地计算时间。我只是认为循环迭代可能会导致广播中的直接for循环效率低下。