4

Suppose I have a long data vector y, plus some indices into it. I want to extract a short snippet or window around every index.

For example, suppose I want to construct a matrix containing 64 samples before and 64 samples after every value that is below three. This is trivial to do in a for-loop:

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 

However,this is not blazingly fast. Is there any way to vectorize (or otherwise speed up) this operation?

(In case this is unclear, the index could be anything and may not necessarily be a property of the data; I just wanted something simple to illustrate the idea.)

7

1 Answer 1

7

Use bsxfun -

snippets = data(bsxfun(@plus,index(:),[-WIN_SIZE:WIN_SIZE])) 
Sign up to request clarification or add additional context in comments.

5 Comments

I just wanted to come up with a double repmat-answer. But this solution with bsxfun is better and slightly faster as well.
@Matt That would follow the pattern of performance numbers seen in Comparing BSXFUN and REPMAT that shows 20-40% improvement with bsxfun(@plus over a repmat version.
You are perfectly right on this. Btw: That's a really nice comparison of bsxfunand repmat!
@Matt Took me few days to compile and assemble those comparison results and seems like it's coming to some use huh! :)
Thanks! For the record, this is about 10x faster than the naive for-loop!

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.