如何在Julia中创建滞后变量?

Kha*_*haa 3 julia

是否有一个函数在Julia中创建滞后变量而不使用任何包?

具体来说,我想embed在Julia中模仿R的功能.

> embed(1:8, 3)
     [,1] [,2] [,3]
[1,]    3    2    1
[2,]    4    3    2
[3,]    5    4    3
[4,]    6    5    4
[5,]    7    6    5
[6,]    8    7    6
Run Code Online (Sandbox Code Playgroud)

经过几个小时的浏览Julia手册,我放弃了在Julia寻找合适的功能.这个丑陋的功能(按R标准)是我到目前为止所拥有的.是否有任何内置功能或任何改进空间?

julia> function embed(x, k)
           n = length(x)
           m = zeros(n - k + 1, k)
           for i in 1:k
               m[:, i] = x[(k-i+1):(n-i+1)]
           end
           return m
       end
embed (generic function with 1 method)

julia> embed(1:8,3)
6x3 Array{Float64,2}:
 3.0  2.0  1.0
 4.0  3.0  2.0
 5.0  4.0  3.0
 6.0  5.0  4.0
 7.0  6.0  5.0
 8.0  7.0  6.0
Run Code Online (Sandbox Code Playgroud)

Fel*_*ema 5

您可以罢免zeroscell跳过初始化.你也可以

embed(x,k) = hcat([x[i+k-1:-1:i] for i in 1:length(x)-k+1]...)'
Run Code Online (Sandbox Code Playgroud)

说明

  • 使用[i+k-1:-1:i]和创建反向步幅索引for
  • 采取这一清单的项目,并使其成为争论hcat使用...
  • 连接步幅(作为参数传递)
  • 使用转置结果 '

编辑:假设length(x)k,你也可以使用:

embed(x,k) = hcat([x[k-i+1:length(x)-i+1] for i in 1:k]...)
Run Code Online (Sandbox Code Playgroud)

这给出了相同的结果,但迭代次数更少,因此分配更少.

  • 原始版本更具可读性,而且可能更快.但它是一个令人印象深刻的单行!请注意,您(几乎)不应该使用极其命名的`cell`数组,因为它们不允许Julia正确推断类型.但是,您的代码确实可以正确推断类型. (5认同)