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

如何在Julia中创建滞后变量?,julia,Julia,有没有一个函数可以在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中寻找合适的函数。

有没有一个函数可以在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

您可以取消
以跳过初始化。你也可以

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

  • 使用
    [i+k-1:-1:i]
  • 使用
  • 连接跨步(作为参数传递)
  • 使用
编辑:假设长度(x)⋙
k
,您还可以使用:

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

这会产生相同的结果,但迭代次数较少,因此分配的数量也较少。

这真的是一种常见的操作吗?您说您编写的代码与R相比“难看”。但实际的R代码要么看起来像这样(而且可能很慢),要么(甚至更糟)是用C编写的。原始代码更可读,而且可能更快。但这是一个令人印象深刻的一行!请注意,您应该(几乎)永远不要使用命名糟糕的
单元格
数组,因为它们不允许Julia正确推断类型。但是,您的代码不会正确推断类型。