Estrapolare dati da vettore

di il
1 risposte

Estrapolare dati da vettore

Ciao a tutti,
ho un vettore SS contenente dei valori numerici. Questo vettore, per come è stato creato, dovrebbe contenere delle sequenze (di diversa lunghezza) di numeri consecutivi. Il mio obiettivo è quello di estrarre in un nuovo vettore SS_new la sequenza di numeri consecutivi più lunga presente in SS.
es.
SS = [21 22 23 24 25 54 55 56 60 61]
SS_new = [21 22 23 24 25 ]
Come posso fare? senza sapere la posizione né la lunghezza della specifica sequenza dentro SS.

Grazie

1 Risposte

  • Re: Estrapolare dati da vettore

    Un possibile approccio potrebbe essere:

    [*] calcolare la differenza tra due elementi consecutivi del vettore con la funzione "diff"
    [*] identificare, nel vettore delle differenze, gli elementi diversi da 1 con la funzione "find". Se la differenza è diversa da 1 i due i-esimi numeri non sono consecutivi. Gli elementi dell'array creato in questo modo rappresentano gli indici delle sezioni di elementi consecutivi nell'array di input
    [*] estrarre con un loop elementi dal vettore di input in un cellarray in base agli intervalli identificati

    Una possibile implementazione potrebbe essere:
    
    % Creazione di un set di dati di esempio
    SS=(1:60)
    r=unique(sort(randi([3 60],1,4)))
    SS(r)=[]
    % Calcolo dell adifferenza tra due elementi consecutivi dell'array
    z=diff(SS);
    % Ricerca dei valori della differenza diversi da 1 (se la differenza tra
    % due valori è diversa da 1, i due valori non sono consecutivi)
    % I valori dell'array rappresentano i limiti degli intervalli delle varie
    % sezioni di elementi consecutivi
    z1=find(z~=1);
    % Inizializzazione del contatore degli elementi del cellarray
    cnt=1;
    % Settaggio del primo elemento del cellarray
    res{cnt}=SS(1:z1(1))
    % Loop sui reatanti elementi del set di intervalli
    for i=1:length(z1)-1
       cnt=cnt+1
       res{cnt}=SS(z1(i)+1:z1(i+1))
    end
    % Settaggio dell'ultimo set di elementi
    res{cnt+1}=SS(z1(end)+1:length(SS))
    % Ricerca dell'elemento più lungo del cellarray
    %   n_elem: numro di elementi della sequenza
    %   idx: indice del vettore sequewnza nel cellarray di output
    [n_elem,idx]=max(cellfun(@length,res))
    fprintf('La sequeza più lunga è conposta da %d elementi\n',n_elem)
    % Assegnazione della sequanza più lunga alk vettore di output
    SS_new=res{idx}
    
Devi accedere o registrarti per scrivere nel forum
1 risposte