2015-03-21 4 views

risposta

10

La differenza è che slice elimina tutte le dimensioni "affettate" con uno scalare (non vettoriale), mentre le dimensioni sub spesso le conservano. Ad esempio:

julia> A = rand(3,3) 
3x3 Array{Float64,2}: 
0.403464 0.229403 0.924686 
0.953741 0.175086 0.49139 
0.0290678 0.705564 0.567355 

julia> a = slice(A, 2, :) # this will be 1-dimensional 
3-element SubArray{Float64,1,Array{Float64,2},(Int64,Colon),2}: 
0.953741 
0.175086 
0.49139 

julia> b = sub(A, 2, :)  # this will be 2-dimensional 
1x3 SubArray{Float64,2,Array{Float64,2},(UnitRange{Int64},Colon),2}: 
0.953741 0.175086 0.49139 

julia> size(a) 
(3,) 

julia> size(b) 
(1,3) 

C'è una sola eccezione: sub gocce dimensioni indicizzati con uno scalare se vengono "finale" dimensioni, ovvero non sono dimensioni successive indicizzati con un vettore:

julia> a = slice(A, :, 2) 
3-element SubArray{Float64,1,Array{Float64,2},(Colon,Int64),2}: 
0.229403 
0.175086 
0.705564 

julia> b = sub(A, :, 2) 
3-element SubArray{Float64,1,Array{Float64,2},(Colon,Int64),2}: 
0.229403 
0.175086 
0.705564 

julia> size(a) 
(3,) 

julia> size(b) 
(3,) 

Se si slice con una gamma, quindi si ottiene un comportamento come sub:

julia> a = slice(A, 2:2, :) 
1x3 SubArray{Float64,2,Array{Float64,2},(UnitRange{Int64},Colon),1}: 
0.953741 0.175086 0.49139 

julia> size(a) 
(1,3) 

Non è la lunghezza dell'indice che conta, è il tipo: qualsiasi dimensione indicizzata con un non scalare verrà mantenuta.

+2

** Se si divide con un intervallo, si ottiene un comportamento come sub **. Ci sono funzionalità aggiuntive con 'sub' che non possono essere fatte con' slice'. Oppure potrebbe 'slice' sostituire' sub' in ogni circostanza. – user3426681