2015-04-20 16 views
5

Podczas indeksowania więcej niż jednego poziomu dla tablicy, działa poprawnie. Ale kiedy użyłem go do przypisania wartości, nie było. Czy ktoś wie, dlaczego A nie zmienia się poniżej?Julia: Przypisanie w tablicach

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

Przypuszczam, że 'A [3: 5] [[true, false, true]]' działa bezpośrednio na kopii "A" zamiast "A". (Ale nie wiem na pewno.) Jednak będzie działało, aby użyć 'A [[3, 5]] = [99, 999]', co jest równoważne. –

Odpowiedz

5

to ponieważ tablice indeksujące pasmami i wektory zwraca nową tablicę z wyjściem (zamiast widokiem w oryginalnej tablicy). Twoja wypowiedź jest równoważna następującej:

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 

można rzeczywiście zobaczyć, że to, co robi Julia przez niektóre z jego użyteczności ekspresyjnych. Zwróć uwagę na jawne nawiasy - to wywołanie setindex! o wyniku indeksowania, który zrobił kopię. (GenSym() jest wewnętrzną sposób określania zmiennej tymczasowej):

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) 

Celem jest, aby w końcu mieć wszystkie widoki powrotne indeksowania tablicy zamiast kopii, ale to wciąż praca w toku.