Điều này là do việc lập chỉ mục mảng theo phạm vi và vectơ trả về một mảng mới với đầu ra (thay vì xem thành mảng gốc). Tuyên bố của bạn tương đương với những điều sau:
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
Bạn thực sự có thể thấy rằng đây là những gì Julia đang thực hiện thông qua một số tiện ích biểu thức của nó. Lưu ý các dấu ngoặc đơn rõ ràng - nó gọi setindex! về kết quả lập chỉ mục, đã tạo bản sao. (GenSym() là một cách nội bộ xác định một biến tạm thời):
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)
Mục đích là để cuối cùng có tất cả quan điểm lợi nhuận mảng lập chỉ mục thay vì bản sao, nhưng đó vẫn là một công việc theo tiến độ.
Nguồn
2015-04-20 20:08:36
Tôi đoán rằng 'A [3: 5] [[true, false, true]] 'hoạt động trên một bản sao của' A' chứ không phải là 'A' trực tiếp. (Nhưng tôi không biết chắc chắn.) Tuy nhiên, nó sẽ hoạt động để sử dụng 'A [[3, 5]] = [99, 999]', tương đương. –