Introduzione a Matlab
Transcript
Introduzione a Matlab
Slide 1 Introduzione a Matlab ® Matlab è: Abbreviazione di MATrix LABoratory Ambiente di sviluppo per il calcolo numerico (non indicato per il calcolo simbolico) Linguaggio di programmazione interpretato Lucio Zambon 1 “Matlab (abbreviazione di Matrix Laboratory) è un ambiente per il calcolo numerico e l’analisi statistica che comprende anche l'omonimo linguaggio di programmazione.” (Wikipedia). Matlab si è dimostrato particolarmente adatto per il calcolo numerico in particolare su matrici. In poco tempo si possono definire matrici, anche composte da numeri complessi, e sono disponibili innumerevoli operatori e funzioni che permettono di lavorare sulle matrici in modo particolarmente efficiente. Esistono numerosissime estensioni (Toolbox) fra cui una anche per il calcolo simbolico (variabili al posto di numeri), ma questo non è certo il punto di forza di Matlab. Matlab è anche un linguaggio di programmazione (in origine) interpretato, esiste tuttavia anche un compilatore Matlab (la cui licenza è piuttosto onerosa). Slide 2 Introduzione a Matlab ® Matlab è inoltre: Prodotto proprietario della MathWorks a partire dal 1984 Esistono almeno 2 cloni (quasi equivalenti) GNU Octave (ottima compatibilità, non completo) Scilab (scarsa compatibilità, abbastanza ricco) Lucio Zambon 2 Matlab è stato creato in Fortan alla fine degli anni '70 all’Università del New Mexico, Nel 1984 è stato riscritto in C da una nuova società, The MathWorks, che da allora ne cura lo sviluppo e ne vende le licenze. Esistono numerosi cloni, cioè programmi con funzionalità del tutto simili. Il vantaggio innegabile della maggior parte di questi è che sono gratuiti (in genere open-source con licenza GPL o simile). I cloni principali sono 2: GNU Octave (Noto anche solo come Octave) I comandi di base sono perfettamente compatibili con Matlab, molti programmi funzionano indifferentemente su entrambe le piattaforme. È consigliato per questo corso. Tuttavia è carente per le applicazioni più avanzate, in particolare la grafica. Scilab è molto più completo di Octave, su aspetti specifici (mex file), alcuni sviluppatori lo ritengono addirittura superiore a Matlab, ma è scarsamente compatibile; esiste un traduttore da Matlab a Scilab. Slide 3 Introduzione a Matlab ® Altre caratteristiche di Matlab Manipolazione di matrici Elaborazione di algoritmi Visualizzazione di funzioni e di dati numerici Creazione di interfacce grafiche Creazione di report Documentazione (in inglese) http://www.mathworks.com/access/helpdes k/help/pdf_doc/matlab/getstart.pdf Lucio Zambon 3 La caratteristica fondamentale di Matlab negli anni è rimasta sempre il calcolo matriciale. Il nucleo fondamentale consiste solo in un interfaccia da terminale per il calcolo matriciale e la produzione di grafici, ma in modo particolarmente efficiente e facile da usare. Negli anni ci sono state numerosissime estensioni, anche se non tutte hanno riscontrato lo stesso favore da parte degli utilizzatori. Matlab è dotato di un linguaggio “general purpose”, si situa al ventunesimo posto nella classifica della popolarità dei linguaggi di programmazione (www.tiobe.com ottobre 2011). Una delle estensioni permette la creazione di interfacce grafiche interattive (GUI) Un altro punto di forza è la documentazione molto ricca, supportata anche da una comunità di utilizzatori. Slide 4 Introduzione a Matlab ® Interfaccia utente di Matlab Lista variabili Storia comandi Finestra comandi Command Window Current directory Browser Lucio Zambon 4 Matlab da qualche anno offre un ambiente molto più ricco di una semplice shell. In sostanza la shell è stata sostituita dalla command window, in questa finestra si immettono i comandi e si vedono i risultati (non grafici). Attorno alla command window ci sono alcune utilissime sottofinestre fra cui la lista delle variabili definite, la storia dei comandi etc. Octave al contrario è rimasto a un interfaccia più spartana. Esistono numerose interfacce grafiche che possono essere utilizzate con Octave, ma in genere sono di livello inferiore Slide 5 Introduzione a Matlab ® Primi passi con Matlab help / doc prima di numerose pagine di aiuto demo avvia numerose dimostrazioni introduttive who / whos lista delle variabili utilizzate quit esce da Matlab Primo programma Matlab disp('hello world') % questo è un commento s = 'hello world'; % il ; finale sopprime l'eco Lucio Zambon 5 La documentazione in linea si ottiene mediante il comando help. Da solo questo comando genera la lista di tutti i toolbox principali, se invece viene seguito dal nome di una funzione viene generata una breve descrizione della funzione il comando doc apre il manuale che solitamente riporta descrizioni più dettagliate. Spesso come primo programma in un qualsiasi linguaggio di programmazione si usa presentare il più piccolo programma che visualizza la scringa “hello world”, in Matlab/Octave questo programma è: disp(‘hello world’) Lo stesso programma si potrebbe scrivere in forma più breve così: ‘hello world’ tuttavia questa forma avrebbe prodotto anche altri messaggi indesiderati. Lo stesso seguito da un puntoevirgola non avrebbe prodotto nessuna stringa. ‘hello world’; In Matlab tutto quello che segue il simbolo percento (%) viene considerato un commento. I commenti vengono ignorati da Matlab/Octave ma servono al programmatore per documentazione. Slide 6 Introduzione a Matlab ® Variabili Una variabile è una locazione di memoria a cui viene assegnato un valore. A questa locazione viene associato un nome key-sensitive a = 5, b = 3, A = a * b, A ~= a ans è una variabile particolare, contiene il risultato dell’ultima operazione compiuta = operatore di assegnazione == test di ugualianza ~= test di disegualianza Lucio Zambon 6 Una variabile è una locazione di memoria, cioè una porzione di memoria di dimensione prestabilita (di default 8 byte) a cui è possibile assegnare un valore. Ad ogni variabile viene assegnato un nome che permette di accedere a quella determinata locazione. I nomi delle variabili Matlab/Octave devono iniziare con una lettera (maiuscola o minuscola) e possono contenere lettere numeri e il carattere underscore (_) fino a un massimo di 32 caratteri (dipende dalla versione di Matlab), la parte eccedente viene ignorata da Matlab/Octave. I nomi delle variabili sono key-sensitive (o case-sensitive), cioè si distinge fra maiuscola e minuscola. L'operatore che permette di assegnare un valore a una variabile è l'uguale (=), questo operatore esige che alla sua sinistra ci sia un identificatore di variabile valido, sarebbe del tutto sbagliata un'espressione come questa: a + 1 = 5 dato che Matlab/Octave non risolve equazioni mediante questa sintassi. A destra dell’uguale ci deve essere un'espressione valutabile (cioè tutti gli elementi devono avere un valore). L'operatore di assegnazione (=) non deve essere confuso con il test di uguaglianza (==) che paragona due espressioni (o due variabili come caso particolare) e restituisce i valori true o false. ~= è il test di diseguaglianza. Slide 7 Introduzione a Matlab ® Espressioni Formule matematiche composte da variabili, costanti numeriche e operatori matematici etc. Alcuni operatori matematici: + - * / < <= > >= ~= == ~ ^ % elevamento a potenza && % AND || % OR Costanti numeriche: 4.5, 0.23e-5, pi (==3.14159…), i ==sqrt(-1) Lucio Zambon 7 Gli operatori matematici in genere sono del tutto intuitivi, tranne quelli già visti e l’elevamento a potenza (^) ad esempio 2^3 == 8, l’operatore logico and (&&), l’operatore or (||, or non esclusivo, in italiano corrisponde alla dicitura e/o) e l’operatore not (~), ad esempio la formula di De Morgan si scrive come: ~(a && b) == ~a || ~b. Esistono alcune costanti predefinite: pi è il pi greco (con molte cifre significative) e è il numero di nepero i,j sono la radice quadrata di -1 (unità immaginaria) Slide 8 Introduzione a Matlab ® Vettori e matrici Le variabili possono essere vettori: A = [4, 13] % vettore riga di 2 elementi z = [-27; -2; 4; 11; 43] % vettore colonna, 5 elem. X = [0 1 2 3 4 5] % vettore riga di 6 elementi Y = [0:5] % vettore riga di 6 elementi == X Variabili di tipo matrice: B = [11, 12; 21, 22] Lucio Zambon 8 I vettori non sono altro che un tipo particolare di matrice (con una sola riga o una sola colonna) I valori di una matrice vengono dichiarati racchiudendoli tra parentesi quadre [ ], gli elementi separati da spazio o virgola stanno nella stessa riga dell’elemento precedente e nella colonna successiva, ad esempio: [1 2] == [1,2] Si consiglia ai principianti di usare sempre la virgola. Gli elementi separati da punto e virgola o da caporiga vengono messi nella riga successiva a quella dell’elemento precedente, ad esempio: [1; 2] == [1 2] Le matrici possono essere definite utilizzando anche variabili (scalari, vettori o matrici) a patto che siano già state definite e che le dimensioni (numero di righe e di colonne) siano sempre compatibili. Esempio: C = [3 5; 1 7] D = [C [1 2; 3 4]; C C] Slide 9 Introduzione a Matlab ® Operatore doppio punto : 0:5 == [0, 1, 2, 3, 4, 5] 0:5 == [0:5] 0:0.1:1 == [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1] [0:10] == [0:1:10] [5:0] % Empty matrix: 1-by-0 5:-1:2 == [5, 4, 3, 2] Lucio Zambon 9 L’operatore doppio punto serve per definire un intervallo di valori consecutivi con differenza 1 fra due elementi consecutivi a meno che non sia specificato un passo diverso con la notazione: valore_minimo:passo:valore_massimo Il passo può essere anche negativo Se si usa l’operatore doppio punto non è obbligatorio racchiudere l’espressione fra parentesi quadre, tuttavia è possibile farlo ugualmente. Slide 10 Introduzione a Matlab ® Indicizzazione di vettori Estrazione dell'elemento i-esimo di un vettore (indici da 1 a n) X(4) Indicizzazione di matrici Viene fornito sempre prima l'indice di riga e poi quello di colonna: B(1,2) % prima riga e seconda colonna B(:,1) % estrae tutta la prima colonna di B B(1:3,:) % estrae le prime tre righe di B Lucio Zambon 10 Per estrarre un elemento di una matrice serve un metodo di indicizzazione. In Matlab si usano le parentesi tonde. All’interno delle parentesi va indicato prima il numero di riga e poi quello della colonna separati da una virgola. Gli indici possono anche essere un vettore di interi, ad esempio 1:3 significa dalla prima alla terza riga se si trova prima della virgola e dalla prima alla terza colonna se si trova dopo la virgola. Due punti da soli significa tutte le righe oppure tutte le colonne a seconda che stia prima o dopo la virgola Come indice si possono usare vettori di interi, ad esempio [1 3 6] indica la prima, la terza e la sesta riga o colonna a seconda che stia prima o dopo la virgola Slide 11 Introduzione a Matlab ® Operazioni fra matrici Trasposizione: A' Esempio: [1, 5, 3]' == [1; 5; 3] Prodotto righe per colonne: A*B Prodotto elemento per elemento: A .* A Il prodotto matrice per scalare viene calcolato elemento per elemento [1, 5; 3, 4] * 2 == [2, 10; 6, 8] Lucio Zambon 11 Trasposizione e prodotto matriciale seguono le regole dell’algebra lineare, pertanto le matrici devono avere dimesioni compatibili. [1, 5; 3, 4] * 2 == [1, 5; 3, 4] .* [2, 2; 2, 2] L’operatore punto premesso a qualunque operatore indica a Matlab/Octave di eseguire elemento per elemento l’operazione relativa all’operatore immediatamente seguente [1, 5; 3, 4] ^ 2 == [1, 5; 3, 4] * [1, 5; 3, 4], [1, 5; 3, 4] * [1, 5; 3, 4] == [16, 25; 15, 31] [1, 5; 3, 4] .^ 2 == [1, 25; 9, 16] Tutte le altre operazioni fra matrice e scalare vengono compiute elemento per elemento: [1, 5; 3, 4] > 2 == [1 > 2, 5 > 2; 3 > 2, 4 > 2] [1, 5; 3, 4] > 2 == [0, 1; 1, 1] Slide 12 Introduzione a Matlab ® Funzioni Esistono due tipi di funzioni: quelle predefinite (builtin) che fanno parte del core (nucleo principale) di Matlab/Octave o di un toolbox (estensione) e quelle definite dall’utente secondo una specifica sintassi. Utilizzo di funzioni Tutte le funzioni si utilizzano mediante la seguente sintassi: [out1, out2, …] = nome_funzione(in1, in2,…) help nome_funzione illustra tutti i parametri Lucio Zambon 12 Non sempre funzioni hanno un numero fisso di parametri in ingresso. Esistono funzioni con nessun parametro e funzioni con un numero variabile di parametri, di norma vengono messi prima i parametri obbligatori e poi quelli opzionali. Le variabili d’uscita sono sempre opzionali, se non ne viene indicata nessuna il risultato della funzione viene posto nella variabile di defult ans. Slide 13 Introduzione a Matlab ® Alcune Funzioni predefinite input(str) richiede di scrivere un dato disp(str), display(str) visualizzano il contenuto di str, disp senza mostrare il nome della variabile length(X) lunghezza di un vettore size(X) dimensioni di una matrice max(X), min(X) massimo e minimo di un vettore eye(n) matrice unitaria, sqrt(X) radice quadrata zeros(m,n), ones(m,n) matrice di 0 e di 1 rand(m, n) matrice di m per n numeri casuali Lucio Zambon 13 La funzione input(str) serve per dare una semplice interattività ai programmi Matlab/Octave, di norma nel parametro str c’è una richiesta di immissione dati; ad esempio a = input('scrivi un numero da mettere nella variabile a'); Se invece di un numero si deve richiedere l’immissione di una stringa è opportuno usare un secondo parametro con valore 's', ad esempio: nome = input('scrivi il tuo nome: ', 's') length(X) == max(size(X)) La matrice unitaria ha 1 sulla diagonale principale e 0 altrove: eye(2) == [1 0; 0 1] zeros(2, 3) == [0, 0, 0; 0, 0, 0], ones[2 1] == [1; 1] Slide 14 Introduzione a Matlab ® Script Uno script è una sequenza di istruzioni identificata con un nome. Gli script sono salvati in un file .m (m-file) I file .m devono stare in una cartella nota a Matlab/Octave tramite la variabile d'ambiente PATH. Per aggiungere una cartella a PATH si usa il comando omonimo PATH, ad esempio: path(path,'c:\tools\goodstuff') Lucio Zambon 14 Se si deve ripetere spesso una sequenza di istruzioni in modo ripetitivo è comodo incapsulare queste istruzioni in un unico contenitore che possa essere eseguito semplicemente richiamando il nome della sequenza. In Matlab/Octave le sequenze di istruzioni (script) sono salvate in dei file di testo con estensione .m (m-file). I file .m devono essere contenuti in una delle cartelle (folder) utilizzate da Matlab/Octave. Il comando path permette di aggiungere una cartella a quelle già conosciute da Matlab/Octave. Slide 15 Introduzione a Matlab ® Definizione di funzioni Una funzione è una sequenza di istruzioni identificata con un nome e dotata di uno spazio delle variabili indipendente (scope). Le funzioni sono salvate in un file .m (m-file) La struttura di una funzione è la seguente: function nome_funzione() alcune_istruzioni Il nome della funzione deve essere lo stesso del file che la contiene (es: nome_funzione.m) Lucio Zambon 15 Anche le funzioni sono salvate in un file .m, ma a differenza degli script possono avere dei parametri di ingresso e di uscita e hanno uno spazio delle variabili (scope) separato, cioè all’interno di una funzione si possono ri-definire variabili con nomi già utilizzate al di fuori della funzione. In questo modo si ha l’indipendenza del codice della funzione rispetto all’ambiente esterno. La comunicazione fra una funzione e il resto dell’ambiente Matlab/Octave avviene solamente tramite i parametri di ingresso e d’uscita (cfr lucidi successivi) o utilizzando la keyword global (vivamente sconsigliate) Slide 16 Introduzione a Matlab ® Funzioni: parametri di I/O Una funzione può avere uno o più parametri in ingresso e può restituire uno o più parametri in uscita function [out1, out2...] = fun_name(in1, in2...) in1, in2... = parametri in ingresso (opzionali) out1, out2... = parametri in uscita (opzionali) Lucio Zambon 16 Le funzioni “interagiscono” con il resto di Matlab/Octave mediante i parametri di ingresso e di uscita. Sia i parametri di ingresso che quelli d’uscita sono opzionali. Si suggerisce di non utilizzare mai più di 7 parametri di ingresso e di utilizzare nomi significativi. È buona norma verificare sempre che il numero, il tipo e i valori dei parametri siano compatibili con le operazioni che vengono compiuti con essi (validazione). Se si hanno meno di due parametri di uscita le parentesi quadre sono opzionali, ad esempio: function output_param = mia_funzione(in1, in2, ...) Slide 17 Introduzione a Matlab ® Esempio di funzione (1) Il file mysquare.m contiene le seguenti istruzioni: % MYSQUARE calcola il quadrato di un numero % mysquare(x), x numero da elevare al quadrato function risultato = mysquare(x) risultato = x^2; % a destra del percento ci sono i commenti % che vengono ignorati dall'interprete % i commenti delle prime righe vengono mostrati % da help mysquare Lucio Zambon 17 In una funzione è molto importante mettere dei commenti, per quanto possibile, comprensibili da tutti. Per controllare che i parametri siano adatti alla funzione stessa, mysquare potrebbe essere riscritta come segue (per dettagli su if e return si veda più avanti): function risultato = mysquare(x) s = size(x); if (s(1)~=s(2)) disp(’il parametro deve essere una matrice quadrata’); return; end risultato = x^2; Slide 18 Introduzione a Matlab ® Esempio di funzione (2) Funzione che restituisce 2 variabili in uscita: la media e la deviazione standard. File mystat.m function [mean,stdev] = mystat(x) %STAT Interesting statistics. n = length(x); mean = sum(x) / n; stdev = sqrt(sum((x - mean).^2)/n); Lucio Zambon 18 Una funzione può produrre più di un risultato (ovvero parametri d’uscita). Ad esempio la funzione mystat che calcola due parametri statistici del vettore x dalla command window dovrà essere chiamata in questo modo: x = [-3, 9, 1, -4, 4, 12, 2, 1, 0] [media, dev_standard] = mystat(x) media == 2.4444 dev_standard == 4.9241 Slide 19 Introduzione a Matlab Lucio Zambon ® 19 Il nome delle funzioni in matlab deve essere lo stesso del file .m che le contiene. I nomi dei parametri in ingresso e uscita devono essere usati con coerenza. Slide 20 Introduzione a Matlab ® Espressioni condizionali: IF if espressione1 istruzioni1 elseif espressione2 istruzioni2 else istruzioni3 end Lucio Zambon 20 La forma breve per l’istruzione if è: IF espressione istruzioni END Prima dell’etichetta END si possono inserire un numero arbitrario di ELSEIF (con la relativa espressione e condizioni) e un unico ELSE. Nel caso di IF annidati un ELSE si intende riferito all’IF più vicino che non abbia già un ELSE associato N.B. In Matlab/Octave le parole chiave sono sempre con lettere minuscole ma nella documentazione ufficiale si usa enfatizzare questi elementi scrivendoli tutti in maiuscolo Slide 21 Introduzione a Matlab ® Esempio di istruzione IF if a ~= 0 % ~= diverso, == test ugualianza b = 1/a else b = NaN % Not-a-Number end Lucio Zambon 21 Prima di qualunque divisione è opportuno verificare che il divisore sia diverso da zero. Quindi la semplice istruzione: b = 1/a Diventa if a ~= 0 b = 1/a else b = NaN end Slide 22 Introduzione a Matlab ® Espressioni condizionali: SWITCH switch switch_expr case case_expr, istruzione, ..., istruzione case {case_expr1, case_expr2,...} istruzione, ..., istruzione otherwise, istruzione, ..., istruzione end Lucio Zambon 22 Nel caso si debba discriminare fra un numero di opzioni maggiore di due (ma sempre un numero limitato) al posto dell’espressione IF si può utilizzare l’espressione SWITCH. Questa espressione condizionale è del tutto equivalente a IF tranne che non occorre ripetere l’espressione di test (switch_expr) ma solo i valori che può assumere. Slide 23 Introduzione a Matlab ® Esempio di istruzione SWITCH METHOD = 'Bilinear'; switch lower(METHOD) case {'linear','bilinear'} disp(‘Metodo lineare.') case 'cubic' disp(‘Metodo cubico.') otherwise disp('Metodo sconosciuto.') end Lucio Zambon 23 Il frammento di codice in questo lucido è equivalente a: METHOD = 'Bilinear'; if strcmp(lower(METHOD),'linear') || strcmp(lower(METHOD),'bilinear') disp('Metodo lineare.') elseif strcmp(lower(METHOD),'cubic') disp('Metodo cubico') else disp('Metodo sconosciuto.') end Slide 24 Introduzione a Matlab ® Iterazioni Un blocco di istruzioni può essere ripetuto un numero arbitrario di volte mediante le istruzioni chiamate ciclo FOR e ciclo WHILE. I cicli possono essere annidati uno nell'altro. Attenzione ad evitare i cicli infiniti! Lucio Zambon 24 Spesso capita di voler ripetere un blocco di istruzioni per un certo numero di volte. Per questo motivo in Matlab/Octave ci sono due istruzioni di iterazione (o cicli): for e while. I due tipi di iterazioni sono perfettamente equivalenti, ma il primo è più adatto se si sa quante volte si deve ripetere il ciclo prima di incominciare la prima iterazione. Il secondo se si scopre solo “in itinere” di aver finito (condizione d’uscita). In tutti i casi il programmatore deve mettere tutta la cura possibile per evitare di ripetere un ciclo all’infinito, come potrebbe capitare sbagliando la condizione di uscita dal ciclo. Matlab/Octave è uno dei pochi lingaggi di programmazione (un altro esempio è R) in cui i programmatori più esperti evitano il più possibile i cicli iterativi. Questa prassi è resa possibile dal fatto che le operazioni su vettori o matrici nella maggior parte dei casi possono sostituire con maggior efficienza i cicli iterativi. Slide 25 Introduzione a Matlab ® Ciclo FOR Esegue un blocco di codice per un numero di volte specificato for variabile = initval:endval istruzione, ..., istruzione end Lucio Zambon 25 Il ciclo for impone che una variabile assuma, uno alla volta ad ogni iterazione, tutti i valori di una espressione. for variabile = espressione istruzioni end Le colonne di espressione vengono assegnate, una alla volta, a variabile e vengono eseguite ripetutamente le istruzioni comprese fino a end. Spesso espressione è nella forma 1:n con n numero di iterazioni. Per ripetere n volte una serie di istruzioni basta scrivere: for i = 1:n fai_qualcosa(); end Slide 26 Introduzione a Matlab ® Esempio ciclo FOR i=1 for x = -5:0.1:5 y(i) = x^2 i=i+1 end Lucio Zambon 26 Il frammento di codice in questa pagina è equivalente a: x = [-5:0.1:5] y = x.^2 Ci possono essere 2 o più cicli for annidati uno dentro l’altro, ad esempio: [m, n] = size(A); for i = 1:m for j = 1:n A(i,j) = A(i,j)^2; end end Slide 27 Introduzione a Matlab ® Ciclo WHILE Esegue ripetutamente un blocco di istruzioni finché una condizione è vera while espressione istruzioni end Lucio Zambon 27 Il ciclo while ripete le istruzioni contenute in esso finché è vera l'espressione immediatamente successiva alla parola riservata while. Di norma viene usato quando prima di incominciare la prima iterazione non si sa quante iterazioni saranno necessarie Slide 28 Introduzione a Matlab ® Esempio ciclo WHILE dividendo = 4567 divisore = 37 quoziente = 0 resto = dividendo while resto > divisore resto = resto - divisore quoziente = quoziente + 1 end Lucio Zambon Il codice in questo lucido produce questo output: resto = 4530 quoziente = 1 resto = 4493 quoziente = 2 resto = 4456 quoziente = 3 ... resto = 90 quoziente = 121 resto = 53 quoziente = 122 resto = 16 quoziente = 123 28 Slide 29 Introduzione a Matlab ® BREAK Interrompe ed esce da un ciclo for o while. Nel caso di cicli annidati esce solo da quello più interno in cui è contenuto. Se non è contenuto in un ciclo for o while esce dalla funzione in cui è contenuto. Interrompe l'esecuzioni di istruzioni if e switch. Lucio Zambon 29 L'istruzione break viene utilizzata se all'interno di un ciclo di iterazioni si verifica un caso particolare che necessita l'uscita immediata dal ciclo. Ad esempio: while condition do_someting() if strange_condition break end end Slide 30 Introduzione a Matlab ® Esempio BREAK X = [1:30]*2; first = 1; last = length(X); searched = 34; while first < last middle = floor((last + first)/2) if X(middle) < searched first = middle; elseif X(middle) > searched last = middle; else break end end Lucio Zambon 30 Algoritmo di ricerca binaria Viene cercato un numero all'interno di un vettore ordinato non decrescente Ad ogni passo si dimezza l'intervallo di ricerca, se viene trovato l'elemento cercato si esce dal ciclo while mediante l'istruzione break Esercizio: creare la funzione binsearch che realizza la ricerca binaria (cioè inserire questo esempio in una funzione e curare che i parametri d’ingresso e d’uscita siano corretti) Slide 31 Introduzione a Matlab ® RETURN Interrompe l'esecuzione di una funzione Esempio: function d = mydet(A) if isempty(A) d = 1; return else ... end Lucio Zambon 31 Una funzione puó essere interrotta in qualunque punto. Ció normalmente avviene in due casi: o (in un caso particolare) si è raggiunto il risultato finale prima della fine della funzione, oppure si è verificato un errore irrecuperabile, in questo caso è buona norma evidenziare una descrizione comprensibile del problema e subito dopo uscire con l'istruzione return Esercizio: completare la funzione mydet Slide 32 Introduzione a Matlab ® END Termina lo spazio d’azione delle istruzioni for, while, switch, (try) e if. Senza end le istruzioni for, while, switch, (try) e if attendono un input ulteriore, l’interprete Matlab/Octave risulta bloccato fino a che non riceverà l’ultimo degli end mancanti. Ciascun end viene accoppiato al più vicino non accoppiato for, while, switch, (try) e if e serve per terminarne lo spazio d’azione. Lucio Zambon 32 Nella pratica capita spesso di dover mettere due o tre end consecutivi, in questi casi è facile dimenticare almeno un end. Il principiante potrebbe avere l'impressione che l'interfaccia di Matlab/Octave sia bloccata, ma aggiungendo tutti gli end che servono si torna alla situazione normale. L’identazione riduce di molto il rischio di questo errore. Slide 33 Introduzione a Matlab ® Stringhe Una stringa è un array di caratteri. Un array di stringhe è una matrice di caratteri, ma le matrici devono essere rettangolari e omogenee (tutti gli elementi sono dello stesso tipo), perciò si devono aggiungere degli spazi alla fine delle stringhe più corte: S = ['ciao ¬¬¬¬ '; 'amico ¬¬¬ '; 'come va?'] Se una delle stringhe è molto più lunga delle altre si ha un grosso spreco di memoria Lucio Zambon 33 I caratteri sono memorizzati come numeri utilizzando la codifica ASCII Le stringhe vengono racchiuse fra apici singoli, ad esempio: parola = 'piccola' Gli apostrofi contenuti nelle stringhe devono essere raddoppiati, ad esempio: Esempio = 'L''apostrofo va raddoppiato' La funzione char() permette la creazione di array di stringhe con l'aggiunta automatica di spazi alla fine di tutte le stringhe che ne hanno bisogno S = char('ciao','amico','come va?') La funzione deblank() rimuove gli spazi alla fine delle stringhe deblank(S(1,:)) == 'ciao' Slide 34 Introduzione a Matlab ® Cell array Un vettore di celle (cell array) è una matrice composta da elementi non omogenei fra loro, cioè ogni elemento (cella) ha un suo tipo in generale diverso dal tipo degli altri elementi. Per creare un vettore di celle si utilizza l'operatore parentesi graffe { } C = {'hello'; 'yes'; 'no'; 'goodbye‘, 5} Lucio Zambon 34 La funzione cell(m,n) permette di creare un vettore di celle di dimensione m per n i cui elementi sono la matrice vuota. Esempio: c = cell(2,2) c= [] [] [] [] Se si opera con le sole stringhe una cella può essere creata con la funzione cellstr() Esempio: C = cellstr([ 'hello'; 'yes'; 'no'; 'goodbye']) Per convertire da cella a matrice e viceversa si possono usare le funzioni cell2mat() e mat2cell() Slide 35 Introduzione a Matlab ® Indicizzazione di un vettore di celle Un cell array viene indicizzato tramite parentesi graffe { } (si noti che si ottiene un valore del tipo contenuto nella cella indicizzata) X = {'un' 'esempio' 5} X{3} = X{3} + 1 Y = {2 [3 -1; 2 2]; 'test' 2} Y{2,2} + X{3} == 8 Lucio Zambon 35 Un cell array potrebbe essere indicizzato anche tramite le parentesi tonde, ma in questo caso si otterrebbe una valore di tipo cella X(3) = {cell2mat(X(3)) + 1} Si ponga attenzione al fatto che il tipo di dato di una cella contenente il numero 8 è diverso dal numero 8. Per questo motivo X(3) + 1 non viene valutato perché non posso efettuare operazioni numeriche fra un numero e una cella Quindi è opportuno scrivere X{3} + 1 Slide 36 Introduzione a Matlab ® Output di dati sprintf(format, A...) usa la stringa di formattazione format per visualizzare i dati contenuti in A e nelle variabili successive. I formati seguono lo standard del linguaggio C, alcuni esempi: %2d = numero intero con 2 cifre %s = stringa %5.2f = numero reale con 5 cifre di cui 2 decimali Esempio: sprintf(‘sono %s e ho %d anni',nome, anni) Lucio Zambon 36 Uno stesso numero può essere rappresentato in molti modi diversi, Ad esempio x = 27; decimale con almeno 3 cifre (0 per quelle mancanti): sprintf('%03d', x) == '027' esadecimale con lettere maiuscole: sprintf('%X', x) == '1B' ottale: sprintf('%o', x) == '33' esponenziale: sprintf('%e', x) == '2.700000e+001‘ Altri esempi: sprintf('%0.3f',(1+sqrt(5))/2) 1.618 sprintf('%0.5g',1/eps) 4.5036e+15 sprintf('%15.5f',1/eps) 4503599627370496.00001 sprintf('%d',round(pi)) sprintf('%s','hello') 3 hello sprintf('The array is %dx%d.',2,3) The array is 2x3. sprintf('\n') è il caporiga su tutte le piattaforme Al posto di sprintf(format, A…) si può trovare anche la funzione fprintf(fid, format, A…) che normalmente invia l’output su file, tuttavia se l’identificatore di file è omesso si comporta esattamente come sprintf. Slide 37 Introduzione a Matlab ® Ingresso/Uscita (1) save filename content options salva il workspace in un file .mat che è un formato binario con documentazione pubblica. Si possono salvare anche solo alcune variabili load filename carica le variabili contenute nel file specificato whos -file filename mostra le variabili contenute in filename Lucio Zambon 37 La funzione save permette di salvare tutte le variabili definite in un file di tipo binario, ad esempio: save mio_file.mat La stessa istruzione può essere scritta anche: save('mio_file.mat') Per salvare solo le variabili p e q save('variabili_p_q.mat', 'p','q') Slide 38 Introduzione a Matlab ® Ingresso/Uscita (2) Lettura/scrittura di file Excel [Numbers, Text] = xlsread(filename, ...) xlswrite(filename, M) N.B. Solo i dati numerici vengono messi nella variabile Numbers mentre le stringhe vengono poste nella variabile Text che è di tipo cell array CSV (Comma Separated Values) Numbers = csvread(filename, ...) csvwrite(filename, M) Lucio Zambon 38 N.B. Nella matrice Numbers gli elementi non numerici vengono riempiti con il valore NaN (Not a Number), in genere è meglio evitare che il file Excel di partenza abbia alcune caselle non numeriche sparse (ad esempio vuote), altrimenti se si vogliono sostituire i NaN con zeri si può utilizzare l'istruzione: Numbers(isnan(Numbers)) = 0 (isnan() restituisce l'indice di tutti gli elementi uguali a NaN) Esistono anche altre funzioni per l'interfacciamento ad altri formati di file, ad esempio: Lotus 1-2-3 wk1read(filename, ...) wk1write(filename,M) XML xmlread(filename, ...) xmlwrite(filename,M) Slide 39 Introduzione a Matlab ® Esempio di utilizzo di xlsread Si scriva un programma che legga un file excel contenente: giocatori, squadre e paghe relative e calcoli la somma di tutte le paghe. [numeric txt] = xlsread('calciatori.xls'); paga = 0; for i=1:length(numeric) paga = paga + numeric(i); end disp(paga); Lucio Zambon 39 Si noti che xlsread ritorna i valori numerici in una variabile e i valori stringa in un'altra variabile (di tipo matrice di celle) Al posto del ciclo for si sarebbe potuto scrivere la semplice espressione: paga = sum(numeric); Il file calciatori.xls ad esempio contiene questi valori: Cristiano Ronaldo Real Madrid 1083000 Ibrahimovic Barcelona 1000000 Messi Barcelona 875000 Eto'o Inter 875000 Kaká Real Madrid 833000 Adebayor Manchester City 708000 Karim Benzema Real Madrid 708000 Carlos Tevez Manchester City 666000 John Terry Chelsea 625000 Frank Lampard Chelsea 625000 Slide 40 Introduzione a Matlab ® Esempio, prima variante Costruire la funzione Matlab che in ingresso abbia il nome di una calciatore, un vettore contenente gli stipendi e una matrice contenente i nomi di alcuni calciatori e le squadre di appartenenza. La funzione ritorni la squadra e la paga del calciatore. Si scriva quindi il programma che legga un file excel contenente: giocatori, squadre e paghe relative, legga da terminale il calciatore desidrato e visualizzi i dati restituiti dalla funzione. Lucio Zambon 40 Nel testo dell’esempio c’è la parola chiave funzione, subito dopo sono descritti i parametri d’ingresso e i parametri d’uscita. Quindi la soluzione dovrà essere del tipo: function [squadra paga] = cerca_calciatore(lista, paghe, calciatore) I nomi dei parametri e della funzione sono del tutto arbitrari (tanto è vero che più avanti è stato usato un nome diverso della funzione per motivi di spazio), ma devono essere usati con coerenza. Slide 41 Introduzione a Matlab ® Esempio, prima variante function [squadra paga]=cercanome(lista,paghe,calciatore) [n m]=size(paghe); for i=1:n if strcmp(calciatore, lista{i,1}) squadra = lista{i,2}; paga = paghe(i); break; end end Lucio Zambon 41 È errato scrivere: if calciatore==lista{i,1} perché si farebbe un confronto che verrebbe valutato correttamente solo se le lunghezze delle stringhe sono uguali, in caso contrario si genererebbe l'errore Matrix dimensions must agree che interromperebbe il programma. Bisogna utilizzare una funzione apposita per il confronto fra stringhe strcmp() Slide 42 Introduzione a Matlab ® Esempio, prima variante [numeric txt] = xlsread('calciatori.xls'); nome = input('scrivi il nome di un calciatore: ', 's'); [squadra paga] = cercanome(txt, numeric, nome); disp(['squadra: ' , squadra]) disp(['paga: ' , sprintf('%d',paga)]) Lucio Zambon 42 Il programma che utilizza la funzione della pagina precedente deve porre cautela unicamente all'interno della funzione disp() Nel primo caso la variabile squadra viene accodata a una stringa fissa (si notino le parentesi quadre attorno alle 2 espressioni). Nel secondo caso un valore numerico viene convertito in stringa (con una formattazione opportuna) mediante la funzione sprintf() Slide 43 Introduzione a Matlab ® Esempio, seconda variante Costruire la funzione Matlab che in ingresso abbia il nome di una squadra, un vettore contenente gli stipendi e una matrice contenente i nomi di alcuni calciatori e le squadre di appartenenza. La funzione ritorni la lista dei giocatori dalla squadra richiesta. Si scriva quindi il programma che legga da terminale la squadra desidrata e il nome del file excel contenente i dati opportuni e visualizzi i dati restituiti dalla funzione. Lucio Zambon 43 A differenza dell'esempio precedente si deve trovare tutti i giocatori stipendiati da una certa squadra Il programma che utilizza la funzione richiesta è come segue: [numeric txt] = xlsread('calciatori.xls'); nome = input('scrivi il nome di una squadra: ', 's'); lista = cercasquadra(numeric, txt, nome); disp(lista) Esercizio: calcolare la somma delle paghe erogate dalla squadra in ingesso. Slide 44 Introduzione a Matlab ® Esempio, seconda variante function calciatori = cercasquadra(paghe, lista, squadra) [n m]=size(paghe); j = 1; for i=1:n if strcmp(squadra,lista{i,2}) calciatori{j,1} = lista{i,1}; calciatori{j,2} = paghe(i); j = j + 1; end end; Lucio Zambon 44 Il parametro d'uscita calciatori deve essere un array di celle in quanto contiene sia stringhe che valori numerici, per questo viene indicizzato con parentesi graffe Slide 45 Introduzione a Matlab ® Esempio, terza variante Costruire la funzione Matlab che in ingresso abbia il nome di un file excel contenente: giocatori, squadre e paghe relative. La funzione ritorni una matrice contenente la lista delle squadre (senza ripetizioni) e la somma delle paghe erogate da ciascuna squadra. Si scriva quindi il programma che legga da terminale il nome del file excel contenente i dati opportuni e visualizzi i dati restituiti dalla funzione. Lucio Zambon 45 Come l'esempio precedente, ma la funzione deve fornire in uscita una tabella di celle contenente nella prima colonna i nomi di ciascuna squadra e nella seconda colonna la somma delle paghe erogate dalla squadra in questione Il programma che utilizza la funzione richiesta è come segue: nome = input('scrivi il nome del file: ', 's'); lista = sommapersquadra(nome); disp(lista) Slide 46 Introduzione a Matlab ® Esempio, terza variante function somme = sommapersquadra(file_calciatori) [paghe lista] = xlsread(file_calciatori); somme{1,1} = lista{1,2}; somme{1,2} = 0; [n m]=size(paghe); for i=1:n [s m]=size(somme); trovato = 0; Lucio Zambon 46 Il parametro d'ingresso viene messo nella variabile file_calciatori. Il parametro d'uscita somme deve essere un array di celle e nelle prime righe viene inizializzato con la prima squadra trovata cioè lista{1,2}. Il ciclo per tutti i calciatori verrà chiuso nella pagina successiva Slide 47 Introduzione a Matlab Esempio, terza variante for j=1:s if strcmp(somme{j,1}, lista{i,2}) somme{j,2} = somme{j,2} + paghe(i); trovato = 1; break; end end if trovato==0 somme{s+1,1} = lista{i,2}; somme{s+1,2} = paghe(i); end Lucio Zambon end ® 47 Il ciclo in questa pagina esamina se la squadra contenuta nella cella lista{i,2} è già presente nella variabile d'uscita, in caso affermativo ne tiene conto nella variabile trovato e incrementa il valore relativo alle paghe. Se la squadra i-esima non è stata trovata viene aggiunta nell'ultimo if, il cui contenuto si sarebbe potuto scrivere in modo più compatto come: somme = [somme; {lista{i,2} paghe(i)}]; L'ultimo end chiude un ciclo for aperto nella pagina precedente Esercizio: verificare che il parametro in ingresso (file_calciatori) sia il nome di un file leggibile e verificare che non sia vuoto (ci sia almeno una riga utile)