【发布时间】:2018-06-22 23:07:44
【问题描述】:
我有一个包含 21 年每日数据的数据向量,并希望创建一个 365 天的滚动窗口,例如下一个周期在前一个周期之后一个月(30 天)出现。在问题中,n_interval 定义了下一个窗口的第一个数据点与上一个系列的最后一个观察值之间的差异。
假设我的每日数据从 2000 年 1 月 1 日开始,那么第一列将从 2000 年 1 月 1 日到 2001 年 1 月 1 日,第二列从 2000 年 2 月 1 日开始,到 2 月 1 日结束, 2001. and ... 最后一列将涵盖 2017 年 1 月 1 日至 2018 年 1 月 1 日。例如,如果:
vec = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]
对于给定变量n_interval = 3、with window_size=5,输出矩阵应如下所示:
mat = [[1 4 7 10 13],
[2 5 8 11 14],
[3 6 9 12 15],
[4 7 10 13 16],
[5 8 11 14 17]]
【问题讨论】:
-
抱歉,您能否阐明 n_interval 值的预期行为?不确定我是否理解这个问题!也许更多的源代码会有所帮助
-
并非示例输出中的所有行都具有相同数量的元素(最后一个有 4 个,其余 5 个),因此您无法将其保存在矩阵中。你想让我做什么?以不同的格式保存还是用 NaN 填充?
-
我不明白该示例与原始问题的对应关系。要重新创建示例,您可以使用以下可怕的一列
mat = vec(mod(bsxfun(@plus, 0:(k-1), (1:n:(numel(vec)-n+1))')-1,numel(vec))+1)其中n=3和k=5是列数。 -
然后 jodag 上面的评论加上最后的转置就可以完成这项工作。或许可以简化为
vec(bsxfun(@plus, 0:(k-1), (1:n:(numel(vec)-n+1))')).' -
我使用了一点voodoo 来得出
numel(vec)-n+1绑定。原来它只是因为n和k的特定值才起作用。我在回答中发布了一种更有原则的方法。
标签: matlab matrix vector sliding-window