在Matlab中矢量化数组索引/子集

Mat*_*use 4 matlab vectorization

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

例如,假设我想构建一个包含64个样本的矩阵,并且在每个低于3的值之后构建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
Run Code Online (Sandbox Code Playgroud)

然而,这并不是非常快.有没有办法对这个操作进行矢量化(或以其他方式加速)?

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

Div*_*kar 7

使用bsxfun-

snippets = data(bsxfun(@plus,index(:),[-WIN_SIZE:WIN_SIZE]))
Run Code Online (Sandbox Code Playgroud)

  • @Matt花了我几天的时间来编译和组装这些比较结果,看起来好像有用了呵呵!:) (2认同)