Matlab中的矢量化数组索引/子集设置

Matlab中的矢量化数组索引/子集设置,matlab,vectorization,Matlab,Vectorization,假设我有一个长数据向量y,加上一些索引。我想围绕每个索引提取一个简短的片段或窗口 例如,假设我要构造一个矩阵,每个值小于3时,包含64个前采样和64个后采样。这在for循环中很容易做到: WIN_SIZE = 64; % Sample data with padding data = [nan(WIN_SIZE,1); randn(1e6,1); nan(WIN_SIZE,1)]; % Sample events, could be anything index = find(data &l

假设我有一个长数据向量y,加上一些索引。我想围绕每个索引提取一个简短的片段或窗口

例如,假设我要构造一个矩阵,每个值小于3时,包含64个前采样和64个后采样。这在for循环中很容易做到:

WIN_SIZE = 64;

% Sample data with padding
data = [nan(WIN_SIZE,1); randn(1e6,1); nan(WIN_SIZE,1)];

% Sample events, could be anything
index = find(data < 3); 

snippets = nan(length(index), 2*WIN_SIZE + 1);
for ii=1:length(index)
   snippets(ii,:) = data((index(ii)-WIN_SIZE):(index(ii)+WIN_SIZE));
end
WIN\u SIZE=64;
%带填充的示例数据
数据=[nan(WIN_大小,1);randn(1e6,1);nan(WIN_大小,1)];
%示例事件,可以是任何事件
索引=查找(数据<3);
snippets=nan(长度(索引),2*WIN_大小+1);
对于ii=1:长度(索引)
片段(ii,:)=数据((索引(ii)-WIN_大小):(索引(ii)+WIN_大小));
结束
然而,这并不是非常快。是否有任何方法可以矢量化(或加速)此操作

(如果不清楚,索引可以是任何东西,也不一定是数据的属性;我只是想用一些简单的东西来说明这个想法。)

使用-


我只是想想出一个双重的回答。但是使用
bsxfun
的解决方案更好,速度也稍快。@Matt这将遵循在中看到的性能数字模式,显示
bsxfun的
20-40%
改进(@plus
超过了repmat版本。你在这一点上完全正确。顺便说一句:
bsxfun
repmat
!@Matt花了我几天的时间来编译和汇编这些比较结果,似乎它有了一些用处,哈!)谢谢!记录在案,这比naive For循环快10倍左右!
索引是(列)向量。你不需要for循环,你可以向量化它,请注意,这个问题有2年以上的历史,在2016b之前的任何问题上都不起作用。马特,好吧,那么我们应该如何处理这个过时的问题和答案?我建议我们尽可能复制成@smci的副本,他说问题/答案过时了?答案仍然是wWorks,即使后来的MATLAB版本提供了一种额外的方法来处理它。
snippets = data(bsxfun(@plus,index(:),[-WIN_SIZE:WIN_SIZE]))