[MATLAB] conteggio occorrenze di un vettore

corel_86
Intanto porgo un saluto a tutti e grazie pe l'eventuale aiuto che mi darete. :wink:
Il mio problema è questo dato un vettore v[1,1,1,2,2,2,3,4,5,8,8]:

- creare una funzione che conta i numeri uguali e memorizzarli in un altro vettore o eventualmente una matrice
- dato un altro vettore u[1,2,2,3,3,3,4,5,5,6] aggiornare il conteggio e memorizzarlo nel vettore creato nel punto precedente

io ho fatto cosi

function y=conta_vettore(x)

n=length(x);
a=[];
conta=0;

valore=max(x);

    for j=0 : valore
        for k=1:n
            if(x(k)==j)
                conta=conta+1;
                a=[x(k),conta];
        
            end
 
        end
    y=a;
    
    conta=0;
    end

end


ma non riesco a memorizzarlo in un array e poi se gli passo un altro array mi azzera tutto

:smt039 :smt039 :smt039

Risposte
Umby2
Se ho ben capito il codice, noto una cosa strana..

"for j=0 : valore ", cioe' tu fai il ciclo da 1 fino al valore massimo presente in tabella ?

E' cosi' ?

corel_86
"Umby":
Se ho ben capito il codice, noto una cosa strana..

"for j=0 : valore ", cioe' tu fai il ciclo da 1 fino al valore massimo presente in tabella ?

E' cosi' ?


si perchè la mia idea è quella di creare un vettore che abbia lunghezza pari al valore massimo del vettore cosi evito di dare una lunghezza fissa al vettore che poi eventualmete verrà cambiata

non so se è un idea giusta ditemi voi.

Umby2
Per me è assurdo....

Immagina che hai il tuo vettore composto cosi':

v[14544,1855221,7446466,9898,2,46546,74114144,55555555]:

corel_86
"Umby":
Per me è assurdo....

Immagina che hai il tuo vettore composto cosi':

v[14544,1855221,7446466,9898,2,46546,74114144,55555555]:



beh allora come dovrei fare? Inoltre non sono io a dare in input il valore da conteggiare ma lo deve fare la funzione quindi ho trovato il valore massimo e poi ho fatto il for con il valore massimo

Umby2
Nell'esempio del vettore che hai postato, i valori sono ordinati.
E' cosi' ?
Avendo il vettore ordinato il ciclo diventa molto semplice, quindi è importante sapere se lo è o meno..

corel_86
"Umby":
Nell'esempio del vettore che hai postato, i valori sono ordinati.
E' cosi' ?
Avendo il vettore ordinato il ciclo diventa molto semplice, quindi è importante sapere se lo è o meno..

si è ordinato ma poi se ho un vettore disordinato basta applicare il comando y=sort(x) e lo ordina il matlab stesso quindi su questo non c'è problema

Umby2
"corel_86":

si è ordinato ma poi se ho un vettore disordinato basta applicare il comando y=sort(x) e lo ordina il matlab stesso quindi su questo non c'è problema


mbè, allora il problema dove è ?
devi scorrere sequenzialmente l'intero vettore fino alla fine .... e man mano decidi cosa fare.

corel_86
Il problema è che non riesco a contare le occorrenze cioè avendo il vettore v=[1, 1, 1, 2, 2, 2, 3, 4, 5, 8, 8] il risultato deve essere un vettore che chiamo conto=[3 , 3 , 1, 1, 1, 0, 0, 2]
dove quei numeri sono
1 compare 3 volte nell'array
2 compare 3 volte nell'array
3 compare 1 volta nell'array
........................................
8 compare 2 volte nell'array

poi quando gli passo il vettore u[1,2,2,3,3,3,4,5,5,6] il vettore conto si aggiorna in questo modo

conto=[4, 5, 4, 2, 3, 1, 0, 2] il problema è che quando genero conto non mi si aggiorna.

Umby2
"corel_86":
Il problema è che non riesco a contare le occorrenze cioè avendo il vettore v=[1, 1, 1, 2, 2, 2, 3, 4, 5, 8, 8] il risultato deve essere un vettore che chiamo conto=[3 , 3 , 1, 1, 1, 0, 0, 2]
dove quei numeri sono
1 compare 3 volte nell'array
2 compare 3 volte nell'array
3 compare 1 volta nell'array
........................................
8 compare 2 volte nell'array



sei certo che devi anche inserire lo 0 in posizione 6 e 7 ?
Il testo ti chiede di contare i numeri che si ripetono.... solo quelli...

Umby2
Giusto qualche linea di codice (spero comprensibile):

       INIZIO SECTION.
           MOVE 1 TO V(1) V(2) V(3)
           MOVE 2 TO V(4) V(5) V(6)
           MOVE 3 TO V(7)
           MOVE 4 TO V(8)
           MOVE 5 TO V(9)
           MOVE 8 TO V(10) V(11)
      *
           move low-value to servizio
           move 0         to k
           perform varying i from 1 by 1 until v(i) = 0
             if v(i) not = servizio
                add 1 to k 
                move v(i) to fq (k, 1), servizio
                move 1    to fq (k, 2)
             else
                add  1    to fq (k, 2)
             end-if
           end-perform.
      *
           display message box
             fq(1, 1) fq(2, 1) fq(3, 1) fq(4, 1) fq(5, 1) fq(6, 1)
             newline
             fq(1, 2) fq(2, 2) fq(3, 2) fq(4, 2) fq(5, 2) fq(6, 2).
       EX-INIZIO.  EXIT SECTION.


Ho posizionato direttamente nel codice il vettore per questioni di pigrizia.
Leggo l'intero vettore (ordinato) e man mano che leggo compongo il secondo vettore (matrice a 2 dimensioni), ogni qualvolta trovo un valore diverso incremento il k, e posiziono la frequenza ad 1, se invece trovo lo stesso valore aggiorno la frequenza (+1)
alla fine visualizzo il vettore composto.

Umby2
Il risultato è questo:
Nella prima riga ci sono i valori
Nella seconda le frequenze


corel_86
grazie Umby ho risolto il mio problema

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.