Dies liegt daran, Indexierungsarrays durch Bereiche und Vektoren ein neues Array mit dem Ausgang (anstelle einer Ansicht in das ursprüngliche Array) zurückgibt. Ihre Aussage ist äquivalent zu den folgenden:
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
können Sie tatsächlich sehen, dass das ist, was Julia durch einige ihrer Expression Dienstprogramme tut. Beachten Sie die expliziten Klammern - es ruft Setindex auf! auf das Ergebnis der Indizierung, die eine Kopie gemacht hat. (Gensym() ist eine interne Art und Weise eine temporäre Variable spezifizieren):
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)
Ziel ist es schließlich müssen alle Array-Indizierung Rückkehr Ansichten anstelle von Kopien, aber das ist immer noch ein work-in-progress.
Ich würde vermuten, dass "A [3: 5] [[true, false, true]]" direkt auf eine Kopie von 'A' anstatt von' A' wirkt. (Aber ich weiß es nicht genau.) Es wird jedoch funktionieren, 'A [[3, 5]] = [99, 999]' zu verwenden, was äquivalent ist. –