efficient loop - finding min and max index of certain value

2 vues (au cours des 30 derniers jours)
mtango
mtango le 9 Nov 2020
Modifié(e) : Stephen23 le 9 Nov 2020
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?

Réponse acceptée

Stephen23
Stephen23 le 9 Nov 2020
Modifié(e) : Stephen23 le 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

Plus de réponses (1)

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

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by