点分配为什么不更新多个数组?

时间:2019-10-01 17:44:39

标签: arrays julia

我想将一些计算分配给一对数组,其中上半部分进入数组x,下半部分进入y。我尝试了以下操作,但是xy均未更新:

x = zeros(2)
y = zeros(3)
[x;y] .= [1.2, 4.5, 2.3, 4.5, 5.6]

1 个答案:

答案 0 :(得分:4)

一般来说, 1 中,.=运算符只是将左侧结果的结果赋值给-在这种情况下,结果是全新数组,其内容为xy的垂直连接。您可以看到[x; y]创建了一个与xy解耦的新数组,只需单独尝试即可:

x = zeros(2)
y = zeros(3)
r = [x;y]
r[1] = 1

julia> r
5-element Array{Float64,1}:
 1.0
 0.0
 0.0
 0.0
 0.0

julia> x
2-element Array{Float64,1}:
 0.0
 0.0

julia> y
3-element Array{Float64,1}:
 0.0
 0.0
 0.0

julia> r .= [1.2, 4.5, 2.3, 4.5, 5.6] # just changes `r`, not `x` or `y`
5-element Array{Float64,1}:
 1.2
 4.5
 2.3
 4.5
 5.6

julia> all(iszero, x) && all(iszero, y)
true

现在,如果将xyLazyArrays.jl放入模拟串联操作的特殊“惰性”容器中,则可以更新它们:

julia> using LazyArrays

julia> ApplyArray(vcat, x, y) .= [1.2, 4.5, 2.3, 4.5, 5.6]
5-element ApplyArray{Float64,1,typeof(vcat),Tuple{Array{Float64,1},Array{Float64,1}}}:
 1.2
 4.5
 2.3
 4.5
 5.6

julia> x
2-element Array{Float64,1}:
 1.2
 4.5

julia> y
3-element Array{Float64,1}:
 2.3
 4.5
 5.6

1 这个通用规则有一个重要的例外:我们支持将带有多个选定索引的索引分配与.=结合使用以更新原始数组。换句话说,语法y[1:2] .= [3.4, 5.6]确实会更新y的前两个元素,即使其他地方的y[1:2]会分配一个与y分离的全新的2元素数组。换句话说,当您在.=的左侧使用索引时,它会在必要时自动使用view