2015-03-21 9 views

Antwort

10

Der Unterschied ist, dass slice alle Dimensionen "in Scheiben geschnitten" mit einem Skalar (Nicht-Vektor), während sub oft behält sie. Zum Beispiel:

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) 

Es gibt eine Ausnahme: sub mit einem Skalar indiziert Dimensionen fällt wenn sie „trailing“ Dimensionen werden, was bedeutet, es gibt keine späteren Dimensionen mit einem Vektor indiziert sind:

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,) 

Wenn Sie slice mit einem Bereich, dann bekommen Sie Verhalten wie 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) 

Es kommt nicht auf die Länge des Index an, sondern auf den Typ: Alle mit einem Nicht-Skalar indizierten Dimensionen bleiben erhalten.

+2

** Wenn Sie mit einem Bereich schneiden, dann erhalten Sie Verhalten wie sub **. Gibt es zusätzliche Funktionalität mit 'sub', die nicht mit' slice' gemacht werden kann? Oder könnte 'slice'' sub' in jedem Fall ersetzen. – user3426681