2015-04-20 21 views
5

जब एक सरणी के लिए एक से अधिक स्तर का अनुक्रमण, यह ठीक काम करता है। लेकिन जब मैंने मूल्यों को असाइन करने के लिए इसका इस्तेमाल किया, तो ऐसा नहीं हुआ। क्या किसी को पता है कि A नीचे क्यों नहीं बदलता है?जूलिया: सरणी में असाइनमेंट

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

मुझे लगता है कि होता है कि 'एक [3: 5] [[सच है, झूठी, सच]]' बल्कि 'से A' सीधे' A' की एक प्रति पर काम कर रहा है। (लेकिन मुझे निश्चित रूप से पता नहीं है।) हालांकि, यह 'ए [[3, 5]] = [99, 99 9] 'का उपयोग करने के लिए काम करेगा, जो बराबर है। –

उत्तर

5

इसका कारण यह है पर्वतमाला और वैक्टर द्वारा अनुक्रमण सरणियों निर्गम (बजाय मूल सरणी में एक दृश्य) के साथ एक नई सरणी देता है। अपने बयान निम्नलिखित के बराबर है:

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 

तुम वास्तव में देख सकते हैं कि इस जूलिया अपनी अभिव्यक्ति उपयोगिताओं में से कुछ के माध्यम से क्या कर रहा है है। स्पष्ट कोष्ठक पर ध्यान दें - यह setindex को कॉल कर रहा है! इंडेक्सिंग के परिणामस्वरूप, जिसने एक प्रति बना ली है। (GenSym() एक अस्थायी चर निर्दिष्ट करने के लिए एक आंतरिक तरीका है):

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) 

लक्ष्य अंततः प्रतियों की बजाय सभी सरणी अनुक्रमण वापसी विचारों के लिए है, लेकिन यह अभी भी एक काम में प्रगति है।