Using find with a vector without having to use a for loop

I have code which does
for t = 1: length(vector2)
idx(t) = find(vector <=vector2(t), 1, 'last');
end
Can I call find.m without using a for loop (or bsxfun.m) and if so how?
Or should I just use histc?
[~,idx]=histc(vector2, vector);

댓글 수: 5

Why do you prefer not to use bsxfun? It seems well suited to the task.
because bsxfun is essentially just a slower version of a for loop.
That is not true! BSXFUN is highly parallized under the hood. Fastest function you can get.
BSXFUN is not a slower version of a loop. I think ARRAYFUN could earn this description, especially when used with anonymous functions.
Having read more about this, I accept my previous statement is wrong and I was getting bsxfun confused with arrayfun.
it seems like bsxfun is what I need. thank you!

댓글을 달려면 로그인하십시오.

 채택된 답변

Friedrich
Friedrich 2013년 3월 14일
편집: Friedrich 2013년 3월 14일
Hi,
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)]')
floor(log10(tmp))
Not sure if maybe log2 would be faster, you would need to try it:
tmp = idx*(2.^[1:numel(b)]')
floor(log2(tmp))

댓글 수: 2

POWER and LOG10 are expensive functions. There must be a solution based on the integer indices also.
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.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

태그

질문:

2013년 3월 14일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by