2011-10-21 19 views
6

Apprezzerei se qualcuno mi mostrasse un modo semplice per farlo. Diciamo che ho un vettore in MATLAB comeSerie di numeri consecutivi (diverse lunghezze)

d = [3 2 4 2 2 2 3 5 1 1 2 1 2 2 2 2 2 9 2] 

voglio trovare la serie di numeri consecutivi "due a due" e le lunghezze di quelle serie.

I numeri due possono essere facilmente trovati da x=find(d==2). Ma quello che voglio è quello di ottenere un vettore che contiene le lunghezze di tutte le serie di gruppi di due numeri consecutivi, il che significa che il mio risultato in questo caso sarebbe un vettore come questo:

[1 3 1 5 1]. 

Chi mi potrebbe aiutare?

+0

domanda correlata: [MATLAB: trovare isole di zeri in una sequenza] (http://stackoverflow.com/questions/3274043/matlab-finding-islands-of-zeros-in-a-enceence) – Amro

risposta

9

Questo sembra funzionare:

q = diff([0 d 0] == 2); 
v = find(q == -1) - find(q == 1); 

v = 

    1 3 1 5 1 

per me

+0

Molto bello. ------- –

+0

Grazie mille, questo sembra risolvere i miei problemi! :) – alex

+0

cosa succede se la v non è un vettore ed è dinamica? se il numero di successi è 5 consecutivi, allora vinci? puoi aiutare @MAX – pac

6

Questo si chiama Run Length Encoding. C'è un buon m-file disponibile per questo a http://www.mathworks.com/matlabcentral/fileexchange/4955-rle-deencoding. Questo metodo è generalmente più veloce del metodo diff/find precedentemente pubblicato.

tic 
d_rle = rle(d==2); 
d_rle{2}(d_rle{1}==1); 
toc 

Il tempo trascorso è 0.002632 secondi.

tic 
q = [0 diff([0 d 0] == 2)]; 
find(q == -1) - find(q == 1); 
toc 

Il tempo trascorso è 0.003061 secondi.

+0

Yep - rle() ha solo una chiamata a find(), e find() è piuttosto lenta – Max

+0

@Max neat ... Non l'ho mai aperto per scoprire perché. Grazie! –

+0

Grazie anche per questa risposta :)! – alex

-1

E se desideriamo gli indici della matrice originale in cui si trovano i valori consecutivi? Inoltre, cosa succede se vogliamo una matrice della stessa dimensione della matrice originale, in cui il numero di valori consecutivi è memorizzato negli indici dei valori consecutivi? Ad esempio:

original_matrix = [1 1 1;2 2 3; 1 2 3]; 

    output_matrix = [3 3 3;2 2 0;0 0 0]; 

Questo problema ha rilevanza per il controllo della qualità dei dati meteorologici. Per esempio, se ho una matrice di dati di temperatura da un certo numero di sensori, e voglio sapere quali giorni avevano valori consecutivi costanti, e quanti giorni erano costanti, così posso quindi contrassegnare i dati come eventualmente errati.

matrice di temperatura è il numero di giorni x numero di stazioni e voglio una matrice di output che è anche il numero di giorni x numero di stazioni, in cui i valori consecutivi sono contrassegnati come descritto sopra.

Problemi correlati