在Matlab中滚动总和

时间:2013-08-09 08:22:28

标签: arrays matlab dataset

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

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

我需要为所有证券提供此功能,因此代码必须为数据集中的所有元素运行多次。

4 个答案:

答案 0 :(得分: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,:);

答案 1 :(得分:3)

使用filter可以非常轻松。

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

x = ones(100,1);

然后我们就像这样应用一个过滤器:

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

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

答案 2 :(得分:2)

使用cumsum的组合!

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

答案 3 :(得分:0)

启动Matlab 2016a,有命令Transculent

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