我有一个横截面数组,其中列为每个日期的价格。我想创建另一个数组,其中包含30天窗口的滚动总和。我宁愿不使用for循环。 目前,我使用以下代码作为一列:
for i=31:n
for j=i-30:i-1
x = x + y(j)
end
sum(i) = x
end
我需要为所有证券提供此功能,因此代码必须为数据集中的所有元素运行多次。
答案 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