我想将一些计算分配给一对数组,顶部部分进入 array x,底部部分进入y。我尝试了以下操作,但既没有x也y没有更新:
x = zeros(2)
y = zeros(3)
[x;y] .= [1.2, 4.5, 2.3, 4.5, 5.6]
Run Code Online (Sandbox Code Playgroud)
一般来说1,.=运算符只是将左侧计算结果分配给 \xe2\x80\x94 ,在这种情况下,结果是一个全新的数组,其内容为x和y垂直连接。您可以看到[x; y]创建了一个与它解耦的新数组x,并且y只需尝试它本身:
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\nRun Code Online (Sandbox Code Playgroud)\n\n现在,您可以更新它们x,y如果它们被放入LazyArrays.jl中模拟串联操作的特殊“惰性”容器中:
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\nRun Code Online (Sandbox Code Playgroud)\n\n1这一一般规则有一个重要的例外:我们支持使用多个选定索引进行索引分配,并结合.=更新原始数组。换句话说,语法y[1:2] .= [3.4, 5.6]确实会更新 的前两个元素y,即使y[1:2]其他地方将分配一个与 解耦的全新的2元素数组y。换句话说,当您在 的左侧使用索引时.=,它会在必要时自动使用 a view。
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |