2015-04-20 10 views
5

Wenn mehr als eine Ebene für ein Array indiziert wird, funktioniert es gut. Aber als ich es benutzt habe, um Werte zuzuweisen, tat es das nicht. Weiß jemand, warum sich A unten nicht ändert?Julia: Zuweisung in Arrays

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

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. –

Antwort

5

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.