我想将一些计算分配给一对数组,其中上半部分进入数组x
,下半部分进入y
。我尝试了以下操作,但是x
和y
均未更新:
x = zeros(2)
y = zeros(3)
[x;y] .= [1.2, 4.5, 2.3, 4.5, 5.6]
答案 0 :(得分:4)
一般来说, 1 中,.=
运算符只是将左侧结果的结果赋值给-在这种情况下,结果是全新数组,其内容为x
和y
的垂直连接。您可以看到[x; y]
创建了一个与x
和y
解耦的新数组,只需单独尝试即可:
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
现在,如果将x
和y
从LazyArrays.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
。