analisi di immagini e dati biologici octave/matlab 24 l2-2-1
TRANSCRIPT
Analisi di Immagini e Dati Biologici
Octave/Matlab
24 L2-2-1
Lavorare con gli m-files
● .m è l'estensione dei file dove vengono salvati gli script per Octave
● Sono file di testo ordinari– Editor consigliati:
● Windows: – Notepad– Notepad++ (http://notepad-plus-plus.org/)
● Linux:– Gedit– Kedit– JEdit– Emacs– vim
m-file
● Aggiunge una nuova funzione o un comando che esegue uno script– <nome>.m: digitando
● octave:1> <nome>– Raccomandato incapsulare gli script all'interno di
funzioni– Il nome della funzione deve corrispondere al nome
del file che precede '.m'– Non sono ammessi spazi o caratteri di
punteggiatura (segue le stesse regole dei nomi delle variabili)
Strutture di Controllo
● Programmando è sovente necessario usare strutture di controllo dell'esecuzione– Le strutture di controllo possono essere condizionali
come il caso della struttura if o switch– Oppure sono delle strutture di loop che indicano un
blocco di comandi da eseguire N volte (ciclo 'for'), oppure fino a quando una condizione è verificata (ciclo 'while')
Esecuzione Condizionale: if...else
● L'esecuzione di uno script avviene dalla prima linea in modo sequenziale. Se non ci sono errori ogni linea è interpretata ed eseguita.
● La struttura if...else...endif permette di eseguire in modo condizionale blocchi di istruzioni
● Forma più semplice
if (condizione)then-body
endif
Esecuzione Condizionale: if...else
● Come esprimere condizioni:– Operatori di confronto >, >=, ==, <, <=, !=, ~=– Operatori booleani || (OR), && (AND)
● Esempio:
if (a < 0 || a > 10)...codice da eseguire se valore di a esterno ad intervallo [0 10]
endif
Esecuzione Condizionale: if...else
● In caso ci sia codice alternativo da eseguire quando la condizione non è verificata
if (a < 0 || a > 10)
...codice da eseguire se valore di a esterno ad intervallo [0 10]
else ...codice da eseguire se valore di a esterno ad intervallo [0 10]
endif
Esecuzione Condizionale: if...else
● Controllo di casi multipli con elseif
if (rem (x,2) == 0) printf(“x è pari\n”); elseif (rem(x,3) == 0) printf(“x è dispari e divisibile per 3\n”); else print (“x è dispari\n”); endif
Controllo con switch
● Utile quando si deve decidere quale codice eseguire in base al valore di una variabile
● Analogie con if (..) … elseif …. elseif …. endifswitch (x)
case 1 fai_qualcosa (); case 2
fai_qualcosaltro();case 3 fai_qualcosaltro_ancora();otherwise altrimenti_fai_questo();
endswitch
Ciclo for
● Ripete un blocco di istruzioni n volte usando una variabile come contatore
● Esempio: stampiamo a terminale 20 valori della funzione esponenziale (exp) nell' intervallo [0, 4]X = linspace(0,4,20);
for p = [1:1:length(x)]
Y = exp(x(p));
printf (“ exp(%d) = %d\n”,x(p),Y);
endfor
Esercizio
● Lavoro volontario:– Cercare sul manuale la sintassi della funzione printf e spiegarla alla prossima lezione
● La funzione printf (e la sua variante fprintf) serve per generare output 'formattato'
● Utile per scrivere messaggi alla console sia per debugging che per informazione
● Queste funzioni ammettono un primo argomento 'stringa' dove viene spiegato quanti e quali argomenti verranno elencati in seguito
Ciclo while...endwhile
● Come per for anche questo ciclo ripete blocchi di comandi ma l'esecuzione è condizionata dalla verifica (ad ogni ciclo) di una condizione
● Le condizioni vengono scritte in modo del tutto analogo a quelle che controllano la struttura if
● E' semplice riscrivere l'esempio per for usando while
● Il ciclo while è utile quando non è possibile stabilire a priori o non è semplice capire quante volte una sequenza di comandi deve girare
Ciclo while...endwhile
● Ciclo for dell'esempio precedente riscritto con while
X = linspace(0,4,20);p = 1;while (p <= 20)
Y = exp(x(p));
printf (“ exp(%d) = %d\n”,x(p),Y);
p = p + 1;endwhile
Ciclo do...until
● Come per while il ciclo è controllato da una condizione argomento della parola chiave until– La differenza sostanziale sta nel fatto che questo
ciclo viene eseguito sempre almeno una volta– Il ciclo continua fino a quando la condizione
argomento di until diventa vera. (Mentre con il ciclo while si interrompe quando diventa falsa)
– Esempio: raccolta in un array dei valori di una funzione fino a quando la variazione del valore della funzione diventa < di un numero fissato
Ciclo do...until
● Raccogliamo N punti della funzione (1 – exp(-x)) tra 0 e un punto da stabilire.
● Condizioni: l'incremento della variabile indipendente x è fissato a 0.2
● Il ciclo continua fino a quando la differenza tra exp(x
i) e exp(x
i+1) diventa < 0.001
Ciclo do...until● Codice dell'esempiodx = 0.2;target_delta = 0.001;xtmp = 0;ytmp = 1 - exp(-xtmp);xp = yp = [ ];
do x = xtmp; y = ytmp; xp = [xp x]; yp = [yp y];
xtmp = x + dx; ytmp = 1 - exp(-xtmp);
delta = ytmp – y;until (delta < target_delta);yp
Condizioni Applicate a Vettori o Matrici● Proprietà degli operatori di confronto:
– Un confronto tra matrici è quella di applicare il confronto e restituire come risultato una matrice di 1 e 0, dove 1 segnala che che la condizione è verificata
A=[1 2 3; 3 -2 1; 5 -4 9];B=[3 2 1; 2 1 -2; 5 5 4];
A > Bans =
1 0 0 0 1 0 0 1 0
A < Bans =
0 0 1 1 0 1 0 0 1
Esempio di funzione: matshuffle
– Creiamo una funzione che riordina in modo casuale gli elementi di una matrice
● Usiamo il comando 'function'per dichiarare la funzione● Il codice della funzione deve essere chiuso dalla parola
chiave 'endfunction' ● Usiamo la funzione 'reshape' per trasformare la matrice
in un array● Riordineremo l'array creandone un altro e quindi usando
ancora 'reshape' rigenereremo una matrice con le stesse dimensione
Esempio: matshuffle.m
● La struttura generale saràfunction matrice_riordinata = matshuffle(matrice_input)%%% commenti per il comando 'help'%
linea comando 1 linea comando 2…. linea comando n
endfunction
Esempio: matshuffle.m Parte 1function shuffled_matrix = matshuffle(m)%% Riordina casualmente gli elementi di una matrice%% matshuffle(matrice_input)%% la matrice di input può avere dimensioni arbitrarie%
% prima di tutto stabiliamo la dimensione della matrice% usando 'size'. Questa funzione ritorna un vettore riga% contenente il numero di righe e di colonne della matrice
matrix_size = size(m);
% la funzione 'prod' ritorna il prodotto degli elementi di % un array. Se l'argomento è una matrice ritorna un array% contenente i prodotti per colonne
numero_elementi = prod(matrix_size);
Esempio: matshuffle.m Parte 2
% reshape ristruttura una matrice in una nuova matrice% avente dimensioni specificate. La funzione ammette% una forma %% reshape(matrix,n,m)%% dove le nuove dimensioni n ed m sono argomenti separati% oppure nella forma%% reshape(matrix,[n m])%% dove le nuove dimensioni sono contenute in un array riga
% collochiamo gli elementi della matrice in un vettore riga
elementi = reshape(m,1,numero_elementi);
Esempio: matshuffle.m Parte 3% procediamo con un loop tante volte quanti sono gli elementi meno 1% il loop for crea la variabile en che prenderà tutti i valori nella% sequenza 1,2,...., numero_elementi%% ad ogni ciclo prenderemo un numero intero casuale compreso tra% 1 e il numero di elementi ancora da randomizzare.% prenderemo quell'elemento e lo metteremo all'inizio dell'array% subito dopo gli elementi già randomizzati% Ci fermiamo quando rimane un elemento
for en = [1:numero_elementi-1]
% generiamo un numero casuale tra 1 e (numero_elementi - en + 1)
rndindex = en + floor((numero_elementi - en + 1) * rand());
% scambiamo ora l'elemento di indice en e quello generato casualmente
tmp = elementi(en); elementi(en) = elementi(rndindex); elementi(rndindex) = tmp; endfor
Esempio: matshuffle.m Parte 4
shuffled_matrix = reshape (elementi,matrix_size);
endfunction
Esempio: matshuffle.m all'operaoctave:1> m=magic(6)m = 35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11octave:2> sum(m)
111 111 111 111 111 111
octave:3> shuffled=matshuffle(m)shuffled = 17 12 10 28 32 22 2 3 27 30 8 25 33 21 34 24 4 20 31 11 7 26 19 6 18 35 36 15 29 13 5 16 14 9 23 1
Octave:4> sum(shuffled)ans =
106 98 128 132 115 87