2015-04-20 16 views
5

Quando si indicizza più di un livello per un array, funziona correttamente. Ma quando l'ho usato per assegnare valori, non è così. Qualcuno sa perché A non cambia sotto?Julia: assegnazione in matrici

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

Direi che 'A [3: 5] [[true, false, true]]' sta agendo direttamente su una copia di 'A' piuttosto che di' A'. (Ma non lo so per certo.) Tuttavia, funzionerà per usare 'A [[3, 5]] = [99, 999]', che è equivalente. –

risposta

5

Questo è perché gli array di indicizzazione di intervalli e vettori restituisce un nuovo array con l'uscita (invece di una vista nell'array originale). La sua dichiarazione è equivalente alla seguente:

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 

Si può effettivamente vedere che questo è ciò che Julia sta facendo attraverso alcuni dei suoi programmi di utilità di espressione. Nota le parentesi esplicite: chiama setindex! sul risultato di indicizzazione, che ha fatto una copia. (Gensym() è un modo interno di specificare una variabile temporanea):

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) 

L'obiettivo è di avere eventualmente tutte le viste di ritorno matrice indicizzazione invece di copie, ma questo è ancora un work in progress.