借助广播,以下代码将起作用,无论x
,y
和z
是标量,大小为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循环,我只能考虑为x
,y
和{的每个组合编写for循环。 if语句中的{1}}。在更复杂的数学表达式中,这可能会使更多变量变得混乱。
与使用许多if语句相比,是否有更优雅的方式来做我喜欢的事情?
答案 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