滑动窗口操作,任意滑动距离,无循环(matlab)

时间:2015-02-20 15:00:18

标签: performance matlab sliding-window

我试图完全向量化一个涉及任意滑动距离的滑动窗口操作,以便最小化此代码的运行时间。

我有两个向量:(1)时间向量,在样本编号中记录一系列事件时间;(2)一个通道向量,指示每个事件时间记录在哪个通道上。所以:

time = [1,13,58,96,1002];
channel = [1,1,1,2,2];

这意味着,例如,在通道1上的样品编号1处检测到事件。我想计算具有任意滑动长度的滑动事件计数。例如,如果只有一个频道,它看起来像这样:

binary = sparse(1,time,1,1,max(time));
nx = max(time);  %length of sequence
nwind = <some window size>;
noverlap = <some size smaller than nwind>;
ncol = fix((nx-noverlap)/(nwind-noverlap));    %number of sliding windows
colindex = 1 + (0:(ncol-1))*(nwind-noverlap);  %starting index of each
idx = bsxfun(@plus, (1:nwind)', colindex)-1;
eventcounts=sum(binary(idx),1);

我想知道(1)是否有人知道如何在不增加循环的情况下为多个频道扩展此功能? (2)或许有更快的方法进行计算?

非常感谢任何想法。 :)

以下是没有矢量化的示例解决方案:

fs = 100; %number of samples in a window 
lastwin = max(time);
slide = fs/2; %slide by a half a window 
winvec = 0:slide:lastwin; 
for x=1:max(channel) 
 t = histcounts(time(channel==x),winvec); 
 t = conv(t, [1,1], 'same'); %convolve to get window size of fs 
 eventcounts(x,:) = t;
end

理想情况下,该脚本会返回一个名为[MxN]的{​​{1}}数组,其中eventcounts是通道总数,M是窗口总数{{ 1}}。在每个职位N中,numel(winvec)将包含频道(i,j)和窗口eventcounts(i,j)的事件数。

0 个答案:

没有答案