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.
fonte
2015-04-20 20:08:36
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. –