使用滑动窗口在Julia数组上查看 编辑:

问题描述

例如,使用滑动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}的创建由点运算符view向量化
  • 我们不想对.的元素进行矢量化处理,因此请改为使用x
  • Ref(x)只是(:)的缩写,我们再次使用点运算符UnitRange进行矢量化

我使用.作为窗口大小,但是您当然可以写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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...