list the result of the index values in ranges

1 visualizzazione (ultimi 30 giorni)
Hello,
I have an array that is populated with the values 1,2 or 3.
a = [1 1 2 2 3 3 2 2 1 1];
and I want to list the ranges of each value. The find function retrieves the index to each number which is great.
[col1] = find(a==1)
[col2] = find(a==2)
[col3] = find(a==3)
but is there a function or some logic i can use to list col1, col2, and col3 as ranges? as in col1 = 1-2 and 9-10 and col2 = 3-4 and 7-8 etc etc.
I appreciate any ideas or help.
Thank you in advance!

Risposta accettata

Jos (10584)
Jos (10584) il 22 Ott 2017
A = [1 1 2 2 3 3 2 2 1 1];
X = arrayfun(@(k) find(A==k),1:3,'un',0) ;
Y = cellfun(@(v) [v([true diff(v) > 1]) ; v([diff(v) > 1 true])]', X,'un',0) ;
% Y{k} contains the start indices (1st column) and end indices (2nd column) for a sequence of the value k in A
  1 Commento
Nasser Ramsis
Nasser Ramsis il 23 Ott 2017
Thank you.
This is working great in 1 of my functions but this other function is giving me this message:
Index exceeds matrix dimensions.
Error in @(v)[v([true,diff(v)>1]);v([diff(v)>1,true])]'
Error in test (line 60) Y = cellfun(@(v) [v([true diff(v) > 1]) ; v([diff(v) > 1 true])]', X,'un',0) ;
Any ideas? do you want to see the entire code?

Accedi per commentare.

Più risposte (1)

Andrei Bobrov
Andrei Bobrov il 22 Ott 2017
Modificato: Andrei Bobrov il 22 Ott 2017
a = [1 1 2 2 3 3 3 2 2 1 1];
l = diff([0,a(:)'])~=0;
b = [strfind(l,[1 0]);strfind([l,1],[0 1])]';
out = accumarray(a(l)',1:size(b,1),[],@(x){sortrows(b(x,:))});

Categorie

Scopri di più su Resizing and Reshaping Matrices in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by