3 views (last 30 days)

Show older comments

Hi,

I have a vector

a = [1 1 1.01 1 1.05 1 .... 1]

which is basically all numbers >=1. I also have a vector b that is the cummulative sum of this vector (and thus sorted), so each increment in this vector is at least 1 and sometimes (often) more than 1.

I also have a random number r between 0 and the total sum of a. Now, I need to find the first element k in b that is larger than r.

I am currently using a simple find comment:

k = find(b>r, 1)

However, I feel like it should be possible for this to be faster. Since I know that k should be at least floor(r) as increments in the cumsum vector are at least 1, I have tried

n = floor(r)

k = find(b(n:end)>r, 1) + n-1

But this seems to be slower despite skipping searching the first n enties of b. Is there an build-in option in matlab for starting the search at a certain index? If not, is there any other faster way? This function takes about 65% of my total computing time. a Is a vector of size 10.000 but it changes very often and I have to make this call millions of times.

dpb
on 3 Aug 2021

With the JIT compiler, loops are pretty quick any more...in fact, with the starting point as the beginning loop index, that may, indeed, be the fastest option. I'd use a counted loop and break though, not the while I think, although you can compare...

for k=floor(r):numel(b)

if b(k)>r, break, end

end

dpb
on 8 Aug 2021

Bruno Luong
on 3 Aug 2021

Edited: Bruno Luong
on 3 Aug 2021

You might try

k = discretize(r,b);

if b(k) == r

k = k+1;

end

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

Start Hunting!