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

Mat*_* B. 3 arrays julia

我想将一些计算分配给一对数组,顶部部分进入 array x,底部部分进入y。我尝试了以下操作,但既没有xy没有更新:

x = zeros(2)
y = zeros(3)
[x;y] .= [1.2, 4.5, 2.3, 4.5, 5.6]
Run Code Online (Sandbox Code Playgroud)

Mat*_* B. 5

一般来说1.=运算符只是将左侧计算结果分配给 \xe2\x80\x94 ,在这种情况下,结果是一个全新的数组,其内容为xy垂直连接。您可以看到[x; y]创建了一个与它解耦的新数组x,并且y只需尝试它本身:

\n\n
x = zeros(2)\ny = zeros(3)\nr = [x;y]\nr[1] = 1\n\njulia> r\n5-element Array{Float64,1}:\n 1.0\n 0.0\n 0.0\n 0.0\n 0.0\n\njulia> x\n2-element Array{Float64,1}:\n 0.0\n 0.0\n\njulia> y\n3-element Array{Float64,1}:\n 0.0\n 0.0\n 0.0\n\njulia> r .= [1.2, 4.5, 2.3, 4.5, 5.6] # just changes `r`, not `x` or `y`\n5-element Array{Float64,1}:\n 1.2\n 4.5\n 2.3\n 4.5\n 5.6\n\njulia> all(iszero, x) && all(iszero, y)\ntrue\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
julia> using LazyArrays\n\njulia> ApplyArray(vcat, x, y) .= [1.2, 4.5, 2.3, 4.5, 5.6]\n5-element ApplyArray{Float64,1,typeof(vcat),Tuple{Array{Float64,1},Array{Float64,1}}}:\n 1.2\n 4.5\n 2.3\n 4.5\n 5.6\n\njulia> x\n2-element Array{Float64,1}:\n 1.2\n 4.5\n\njulia> y\n3-element Array{Float64,1}:\n 2.3\n 4.5\n 5.6\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

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

\n