[MatLab]

sanoro87
salve a tutti,
ho un problema che non riesco a risolvere:
ho una matrice 1*20000 di elementi esclusivamente 0 e 1.
devo riuscire a creare una struttura che mi conti il numero di 0 e il numero di 1 consecutivi.
ad esempio se la mia riga fosse del tipo:
0001111000011001100011000.........
devo ottenere una struttura che mi restituisca

numero di 0 numero di 1
3 4
4 2
2 2
3 2
3

e cosi via..
qualcuno saprebbe aiutarmi??
grazie mille!

Risposte
sanoro87
numero di 0
3
4
2
3
3


numero di 1
4
2
2
2

walter891
a me viene in mentre di creare un contatore con un ciclo if che si incrementa se trova un valore uguale al precedente, altrimenti stampa il risultato e si azzera per ricominciare col nuovo simbolo

sanoro87
e come lo implementeresti?

walter891
l'idea di base è questa, supponiamo che il vettore si chiama v
k=1 %inizializzo il contatore
for i=2:20000
if v(i)==v(i-1)
   k=k+1;
else
   k
   k=1;
end
end

ovviamente si può lavorarci per migliorarlo, ad esempio si possono passare ad un altro vettore i valori di k e stamparli tutti assieme alla fine

apatriarca
Un modo potrebbe essere il seguente:
% vettore iniziale
A = [0 0 0 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 1 0 0 0];
% trova gli indici in cui il valore cambia
% diff(A) vale 1 o -1 quando i due valori successivi sono diversi..
d = find(abs(diff(A)));
% calcola la lunghezza di ogni sottostringa
res = [d(1) diff(d)];

sanoro87
apatriarca grazie l'esempio funziona perfettamente.
ho solo due domande:
1. posso ottenere un res solo per gli zeri e un res solo per gli 1? perché cosi mi mette nella matrice res sia il numero di 0 che il numero di 1.
2. potresti spiegarmi meglio come funziona diff(A)??

scusami lo so che sono un mezzo disastro ma sn alle prime armi con matlab e quindi molte funzioni mi risultano sconosciute.
grazie mille cmq!!

apatriarca
diff(A) è il vettore delle differenze tra valori consecutivi. Corrisponde al vettore che si ottiene facendo il seguente calcolo:
A[2:end] - A[1:(end-1)]

Siccome i due valori si scambiano tra di loro, è sufficiente separare i valori con indici pari e dispari. Per associare uno dei due array agli 1 e l'altro agli 0 devi però testare con quale valore inizia la sequenza.

sanoro87
grazie ancora.
provero' a trovare un modo per separare i valori di zero e uno magari tramite le funzioni odd e even anche perché conosco solo quelle.

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