2016-01-25 35 views
4

假設我有一個長數據向量y,加上一些索引。我想提取每個索引周圍的短片段或窗口。在Matlab中向量化數組索引/子集

例如,假設我想構造一個包含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 

但是,這並不是很快。有什麼方法可以矢量化(或以其他方式加速)此操作?

(如果這還不清楚,該指數可以是任何東西,不一定是數據的屬性;我只是想簡單的東西來說明這個想法。)

+0

'index'是一個(列)向量。你不需要一個for循環,你可以對它進行矢量化,參見[在給定索引前後獲取矢量索引(窗口+/- 1)](https://stackoverflow.com/questions/48881754/get- vector-indices-before-and-after-window-1-given-indices) – smci

+0

請注意,這個問題已經有2年的歷史了,而且在2016年以前的任何東西都不起作用。 –

+0

馬特,好的,那麼我們應該如何處理這個過時的問題和答案?我建議我們關閉 - 重複進入[獲取向量索引之前和之後(窗口+/- 1)給定的指數](https://stackoverflow.com/questions/48881754/get-vector-indices-before-and -after-window-1-given-indices) – smci

回答

7

使用bsxfun -

snippets = data(bsxfun(@plus,index(:),[-WIN_SIZE:WIN_SIZE])) 
+1

我只想提出一個雙'repmat'-答案。但是'bsxfun'這個解決方案更好,並且也更快。 – Matt

+1

@Matt這將遵循['比較BSXFUN和REPMAT'](http://stackoverflow.com/questions/29719674/comparing-bsxfun-and-repmat)中顯示的性能數字模式,它顯示'20-40% bsxfun(@ plus)在repmat版本上的改進 – Divakar

+1

你完全正確:Btw:對bsxfun和repmat的比較! – Matt