朱莉娅语:sub与slice函数

use*_*681 8 arrays function julia

有人可以用简单的语言解释julia的v0.4函数之间的区别:

切片 (也许是切片)

一些简单的例子会非常受欢迎.非常感谢

tho*_*oly 11

不同之处在于slice,使用标量(非向量)将所有维度"切片",同时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)
Run Code Online (Sandbox Code Playgroud)

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

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,)
Run Code Online (Sandbox Code Playgroud)

如果你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)
Run Code Online (Sandbox Code Playgroud)

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

  • **如果您使用范围进行切片,那么您将获得类似sub**的行为.`sub`是否有任何其他功能无法用`slice`完成.或者可以在每种情况下"切片"替换"子". (2认同)