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

时间:2015-11-16 15:53:00

标签: julia

是否有功能在Julia中创建滞后变量而不使用任何包?

具体来说,我想模仿朱莉娅的R embed函数。

> 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

经过几个小时的浏览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

1 个答案:

答案 0 :(得分:5)

您可以解除cellzeros以跳过初始化。你也可以

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

解释

  • 使用[i+k-1:-1:i]for
  • 创建反向步幅索引
  • 使用列表项,并使用hcat
  • 将其设为...参数
  • 连接strides(作为参数传递)
  • 使用'
  • 转置结果

编辑:假设length(x)k,您还可以使用:

embed(x,k) = hcat([x[k-i+1:length(x)-i+1] for i in 1:k]...)

它给出相同的结果,但迭代次数较少,因此分配的次数较少。

相关问题