问题描述
例如,使用滑动window = 2,在数组上创建视图的最有效方法是什么
让我们说:
x = collect(1:1:6)
# 1 2 3 4 5 6
我想创建一个这样的视图:
# 1 2
# 2 3
# 3 4
# 4 5
# 5 6
到目前为止,我仅找到此选项,但不确定是否是最佳选择:
y = Array{Float32,2}(undef,nslides,window)
@inbounds for i in 1:window
y[:,i] = @view x[i:end-(window-i)]
end
解决方法
一个班轮是:
view.(Ref(x),(:).(1:length(x)-1,2:length(x)))
测试:
julia> x=collect(1:6);
julia> view.(Ref(x),2:length(x)))
5-element Array{SubArray{Int64,1,Array{Int64,1},Tuple{UnitRange{Int64}},true},1}:
[1,2]
[2,3]
[3,4]
[4,5]
[5,6]
说明:
-
{li} {li}的创建由点运算符
- 我们不想对
.
的元素进行矢量化处理,因此请改为使用x
-
Ref(x)
只是(:)
的缩写,我们再次使用点运算符UnitRange
进行矢量化
view
向量化
我使用.
作为窗口大小,但是您当然可以写2
编辑:
如果您想要一个库函数,它将为您工作:
view.(Ref(x),(:).(1:length(x)-(window-1),window:length(x)))
当然,您可以将要运行的功能放在滑动窗口上,而不仅仅是收集。
,一个带有包装(我的包装)的解决方案是这样的:
julia> using Tullio
julia> x = 1:6; window = 2;
julia> @tullio y[r,c] := x[r+c-1] (c in 1:window)
5×2 Matrix{Int64}:
1 2
2 3
3 4
4 5
5 6