efficient loop - finding min and max index of certain value

2 views (last 30 days)
I have an array that has for example the following structure:
ic = [ 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 ....... 60000 60000 60000]'
and i want to find the minimum and maximum index of every value in ic. I created the following loop, but it is rather slow:
min_idx = zeros(1, max(ic))';
max_idx = zeros(1, max(ic))';
for n=1:max(ic);
id = ic;
id == n;
idx = find(id);
min_id = min(idx); %should return the minimum index of every value in ic
max_id = max(idx); %should return the miximum index of every value in ic
min_idx(n) = min_id;
max_idx(n) = max_id;
end
With this code it takes around 320 sec to finish. How can this be made faster to run?

Accepted Answer

Stephen23
Stephen23 on 9 Nov 2020
Edited: Stephen23 on 9 Nov 2020
Assuming that each value occurs only within one contiguous block:
ic = [1;1;1;1;1;1;1;1;2;2;2;2;2;2;2;3;3;3;3;3;60000;60000;60000];
tmp = diff(ic(:))~=0;
idx_min = find([true;tmp])
idx_min = 4×1
1 9 16 21
idx_max = find([tmp;true])
idx_max = 4×1
8 15 20 23

More Answers (1)

David Hill
David Hill on 9 Nov 2020
m=find(diff(ic));
max_idx=[m,length(ic)];
min_idx=[1,m];

Categories

Find more on Creating and Concatenating Matrices 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!