2015-04-20 21 views
5

Khi lập chỉ mục nhiều hơn một cấp cho một mảng, nó hoạt động tốt. Nhưng khi tôi sử dụng nó để gán các giá trị, nó không có. Có ai biết tại sao A không thay đổi dưới đây?Julia: Chuyển nhượng trong mảng

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

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

Trả lời

5

Đ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 độ.

Các vấn đề liên quan