1

我有一个横截面数组,其中列作为每个日期的价格。我想创建另一个具有 30 天窗口滚动总和的数组。我宁愿不使用 for 循环。目前,我在一列中使用以下代码:

for i=31:n
 for j=i-30:i-1
  x = x + y(j)
 end
sum(i) = x
end

我需要对所有证券执行此操作,因此代码必须针对数据集中的所有元素运行多次。

4

4 回答 4

4

对于每一列x,您可以与 30 个序列进行卷积,然后删除初始和最终瞬态:

N = 30;
y = conv(x,ones(N,1));
y = y(N:end-N+1);

如果X是一个矩阵,您可以类似地同时处理所有列:

y = conv2(ones(N,1),1,X);
y = y(N:end-N+1,:);
于 2013-08-09T08:27:21.117 回答
3

这很容易使用filter.

假设你有一个简单的向量:

x = ones(100,1);

然后我们只是对它应用一个过滤器,如下所示:

filter(ones(1,30),1,x)

如果x是矩阵,这也适用,例如ones(100,2)

于 2014-05-12T10:20:18.483 回答
2

使用cumsum's 的组合!

data = 1:10;
n = length(data);
window = 3;
rollSum = cumsum(data)-[zeros(1,window), cumsum(data(1:n-window))];
rollSum =

 1     3     6     9    12    15    18    21    24    27

1=1
1+2=3
1+2+3=6
  2+3+4=9
    3+4+5=12
于 2013-10-01T13:52:14.027 回答
0

启动 Matlab 2016a 有命令movsum

http://www.mathworks.com/help/matlab/ref/movsum.html

于 2016-03-22T07:00:35.590 回答