Julia:数组中的赋值

6

当对数组进行多层索引时,它能正常工作。但是当我使用它来赋值时,它就不能正常工作了。有人知道为什么下面的 A 没有改变吗?

In  [4]: A = rand(6)

Out [4]: 6-element Array{Float64,1}:
 0.111552
 0.155126
 0.78485 
 0.147477
 0.362078
 0.959022

In  [5]: A[3:5][[true,false,true]]

Out [5]: 2-element Array{Float64,1}:
 0.78485 
 0.362078

In  [6]: A[3:5][[true,false,true]] = [99, 999]

Out [6]: 2-element Array{Int64,1}:
  99
 999

In  [7]: A

Out [7]: 6-element Array{Float64,1}:
 0.111552
 0.155126
 0.78485 
 0.147477
 0.362078
 0.959022

1
我猜测 A[3:5][[true, false, true]] 是在 A 的副本上操作而不是直接在 A 上操作。(但我不能确定。)然而,使用 A[[3, 5]] = [99, 999] 也可以达到同样的效果。 - Alex A.
1个回答

5
这是因为通过范围和向量索引数组返回的是一个带有输出的新数组(而不是原始数组的视图)。你的语句等同于以下内容:
julia> A = rand(6)
6-element Array{Float64,1}:
 0.806919
 0.445286
 0.882625
 0.556251
 0.719156
 0.276755

julia> B = A[3:5]
3-element Array{Float64,1}:
 0.882625
 0.556251
 0.719156

julia> B[[true,false,true]] = [99, 999]
2-element Array{Int64,1}:
  99
 999

julia> A'
1x6 Array{Float64,2}:
 0.806919  0.445286  0.882625  0.556251  0.719156  0.276755

julia> B'
1x3 Array{Float64,2}:
 99.0  0.556251  999.0

通过一些表达式工具,您实际上可以看到 Julia 正在执行的操作。请注意明确的括号——它正在调用索引结果上的 setindex!,这已经复制了一份。 (GenSym() 是指定临时变量的内部方式):

julia> :(A[3:5][[true,false,true]] = [99, 999])
:((A[3:5])[[true,false,true]] = [99,999])

julia> expand(:(A[3:5][[true,false,true]] = [99, 999]))
:(begin
        GenSym(0) = (top(vect))(99,999)
        setindex!(getindex(A,colon(3,5)),GenSym(0),(top(vect))(true,false,true))
        return GenSym(0)
    end)

目标是最终使所有数组索引返回视图而不是副本,但这仍然是一个正在进行的工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接