如何在Matlab中进行滑动窗口操作?

时间:2016-05-18 04:31:44

标签: matlab loops sequence

我有以下代码

x=randi([1 150],1,400); 
d=max(x);
m=numel(x);
y=zeros(d,1);
p=zeros(d,d);
for k=1:m-1
y(x(k))=y(x(k))+1; 
p(x(k),x(k+1))=p(x(k),x(k+1))+1;
end
p=bsxfun(@rdivide,p,y);
p(isnan(p)) = 0; 
j=prod(p(p~=0));
[~,~,idx] = unique(x);
q=prod(hist(idx,1:max(idx))/numel(x));
s=log(j);
l=log(q);
g=s+l

在上面的代码随机没有。生成从1到150,序列长度为400.最后我得到输出g,假设随机没有。代码生成的序列是

x=[5,96,96,55,55,65,65,65,12,12,6,7,9,9,9,31,31,14,26,26,26,101,101,145,145,...]

所以代码给出了整个序列的输出,但是我希望输出大小为10的滑动窗口,即序列的o / p

[5,96,96,55,55,65,65,65,12,12], 

然后跳过第一个元素并添加下一个元素,使窗口大小保持不变,即

[96,96,55,55,65,65,65,12,12,6], 

然后是

[96,55,55,65,65,65,12,12,6,7], 

同样到最后,怎么做。

1 个答案:

答案 0 :(得分:0)

使用for循环的一种简单方法是代码。

x=randi([1 150],1,12)

m=numel(x);
N=10;   %Window length

for n=0:m-N;

    y=x(1+n:N+n)

end

完整代码将在下面。

xr=randi([1 150],1,20)

z=numel(xr);
N=10;  %Window length


gAll=zeros(1,z-N+1);

for n=0:z-N;

    x=xr(1+n:N+n)

    d=max(x);
    m=numel(x);
    y=zeros(d,1);
    p=zeros(d,d);
    for k=1:m-1
    y(x(k))=y(x(k))+1; 
    p(x(k),x(k+1))=p(x(k),x(k+1))+1;
    end
    p=bsxfun(@rdivide,p,y);
    p(isnan(p)) = 0; 
    j=prod(p(p~=0));
    [~,~,idx] = unique(x);
    q=prod(hist(idx,1:max(idx))/numel(x));
    s=log(j);
    l=log(q);
    g=s+l

    gAll(n+1)=g;

end

plot(gAll)