Julia 语言:sub 与 slice 函数

Julia language: sub vs. slice function

谁能用简单的术语解释一下 julia 的 v0.4 函数之间的区别:

sub and slice (and maybe slicedim)

一些简单的例子将非常有用。 非常感谢

不同之处在于 slice 使用标量(非向量)删除所有维度 "sliced",而 sub 通常保留它们。例如:

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)

有一个例外:sub 删除使用标量索引的维度 如果 它们是 "trailing" 维度,这意味着以后没有使用向量索引的维度:

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

如果你 slice 有一个范围,那么你会得到类似 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)

重要的不是索引的长度,而是类型:任何使用非标量索引的维度都将被保留。