Using find with a vector without having to use a for loop
1 view (last 30 days)
Show older comments
Matlab2010 on 14 Mar 2013
I have code which does
for t = 1: length(vector2)
idx(t) = find(vector <=vector2(t), 1, 'last');
Can I call find.m without using a for loop (or bsxfun.m) and if so how?
Or should I just use histc?
Friedrich on 14 Mar 2013
Edited: Friedrich on 14 Mar 2013
use bsxfun and make sure one vector is a row vector and the other a column vector (a would be vector and b would be vector2)
a = [1 2 3 4 5 6]
b = [ 1 5 8 3 -10 2]
idx = bsxfun(@le,a',b)
Now you need to get a bit tricky I guess:
tmp = idx*(10.^[1:numel(b)]')
Not sure if maybe log2 would be faster, you would need to try it:
tmp = idx*(2.^[1:numel(b)]')
Jan on 14 Mar 2013
Yes! When the input vector2 (as in the original question) is sorted (and find(., 1, 'last') implies that it is), the logical matrix created by bsxfun contains zeros on the left and ones on the right (or top and bottom?). Then this matrix can be reshaped to a row vector and strfind searchs for [false true]. Finally the resulting indices must be cleaned up using mod() with the number of columns.
More Answers (0)
Find more on Matrix Indexing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!Start Hunting!