我试图完全向量化一个涉及任意滑动距离的滑动窗口操作,以便最小化此代码的运行时间。
我有两个向量:(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)
的事件数。