Introduzione a Matlab



Documenti analoghi
Introduzione a Matlab

Introduzione a Matlab

Introduzione a Matlab

Introduzione all ambiente MATLAB. Richiami II. Calcolo Numerico - A.A. 2008/09

MATLAB I/O. Informatica B - A.A. 2012/2013 ACQUISIZIONE DI INPUT DA TASTIERA

8 Introduzione MATLAB

UD4 - MATLAB. M-file. Efficienza degli algoritmi. Formati d uscita

Introduzione all ambiente MATLAB. Richiami II. Analisi Numerica - A.A. 2007/08

8 Introduzione MATLAB

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Matlab: esempi ed esercizi

Introduzione a Matlab

Fondamenti di Informatica A. A / 1 9

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Metodi di Analisi dei Dati Sperimentali. AA 2009/2010 Pier Luca Maffettone. Elementi di Matlab

A.A. 2018/2019. Fondamenti di Programmazione in MATLAB FONDAMENTI DI INFORMATICA E PROGRAMMAZIONE. Docente Prof. Raffaele Pizzolante

INTRODUZIONE A MATLAB

INTRODUZIONE A MATLAB. Introduzione. Calcolatrice base. Calcolatrice base. Variabili predefinite o speciali. Variabili predefinite o speciali

Introduzione al MATLAB c Parte 2

>> A = [1 2 3; 4 5 6; 7 8 9]; >> A

Introduzione al MATLAB c Parte 3 Script e function

DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOIGNEGNERIA. INFORMATICA B Ingegneria Elettrica. Script in Matlab

Laboratorio di Matlab

Scilab. Introduzione a Scilab - Vettori. Corso di Informatica CdL: Chimica. Claudia d'amato.

Informatica Applicata al Suono Tutorial Matlab

Programmare. Condizioni logiche. Condizioni Logiche Costrutti Decisionali Costrutti di Ciclo

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

Introduzione ad Octave

Metodi numerici con elementi di Programmazione A.A

Introduzione al MATLAB c Parte 3 Script e function

Introduzione al MATLAB c Parte 3 Script e function

Fondamenti di Informatica

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Introduzione a Matlab

Matlab: Script e Funzioni

Laboratorio di Informatica I

Lezione 5 e 6. Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza. Valentina Ciriani ( ) Laboratorio di programmazione

Script in Matlab. INFORMATICA B + C (sezione L-Z) Ingegneria Elettrica, Chimica e dei Materiali

Esercitazione 00 Introduzione a Matlab

Strutture di controllo condizionali in Matlab

Dati due punti sul piano calcolare la loro distanza

Qualsiasi programma in C++ segue lo schema:

Variabile, costante ed espressione

Primi script in MATLAB

Calcolo Numerico A.A Esercitazione n

Introduzione a Matlab

Laboratorio di Calcolo Numerico Laboratorio 3: Algoritmi stabili e instabili, Bisezione

Operatori relazionali

Laboratorio di Calcolo Numerico Laboratorio 8: Vettori e Matrici

Programmare. Definire una sequenza di istruzioni che specificano come effettuare una elaborazione

Paolo Bison. Fondamenti di Informatica Ingegneria Meccanica Università di Padova A.A. 2008/09

Introduzione. Corso di Metodi Numerici. 06 Marzo 2019

Lezione 6 Introduzione al C++ Mauro Piccolo

Elementi di Base. Introduzione a Python.

Elementi di Informatica A. A. 2016/2017

Paolo Bison. Fondamenti di Informatica A.A. 2006/07 Università di Padova

Linguaggio Testuale. E un formalismo che consente di rappresentare gli algoritmi mediante semplici istruzioni in linguaggio «parlato»

FONDAMENTI DI INFORMATICA

Laboratorio di Matlab

Laboratorio di Programmazione Laurea in Ingegneria Civile e Ambientale

Pseudo codice. Paolo Bison. Fondamenti di Informatica 1 A.A. 2003/04 Università di Padova. Pseudo codice, Paolo Bison, A.A , p.

STRUTTURE DI CONTROLLO DEL C++

Introduzione a MATLAB

Matlab. Istruzioni condizionali, cicli for e cicli while.

1) Matlab e simulazione. 2) Esempi di utilizzo. Mauro De Sanctis corso di Informazione e Codifica Università di Roma Tor Vergata

Programmare. Definire una sequenza di istruzioni che specificano come effettuare una elaborazione

Università degli Studi di Ferrara

Dinamica e Controllo dei Processi Energetici. AA 2009/2010 Pier Luca Maffettone. Elementi di Matlab

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 8 14/11/2013

Calcolo Numerico A.A Lab n

Octave. Luca Abeni. Informatica Luca Abeni 1 / 21

Primi esempi di programmi. Il tipo int Le variabili Altri tipi interi Operatori di assegnazione

Programmare con MatLab IV

MATLAB - Introduzione. Antonino Polimeno

Introduzione al MATLAB c Parte 1 Variabili ed array

Introduzione al MATLAB c Parte 1 Variabili ed array

8 Introduzione MATLAB

Algoritmi stabili e instabili

Unità Didattica 2 Linguaggio C. Espressioni, Operatori e Strutture linguistiche per il controllo del flusso

Il primo programma C++

Pseudo codice. Pseudo codice, Paolo Bison, FI07, p.1 / Pseudo codice, Paolo Bison, FI07, p.3

Assegnazione di una variabile

L AMBIENTE CODE BLOCKS E L IO

Diagrammi di flusso (Flow Chart)

RICONOSCIMENTO DI FORME A.A OBIETTIVI PARTE 1 INTRODUZIONE A MATLAB

Programmazione lato client. JavaScript. Applicazioni di Rete M. Ribaudo - DISI. JavaScript

Matematica con Python

Il programma OCTAVE per l insegnamento dell algebra lineare nella Scuola Secondaria p. 1

Javascript: il browser

Primo programma in C

Foglio Elettronico Lezione 1

MATLAB c. Lucia Gastaldi Dipartimento di Matematica Lezione 4 (15 ottobre 2003)

Matlab 5. Funzioni. Slide basate sul corso di C. Blundo. A.A. 2010/ GPersiano. Laboratorio di Informatica per Fisici 1

Transcript:

Slide 1 Matlab è: Abbreviazione di MATrix LABoratory Ambiente di sviluppo per il calcolo numerico (non indicato per il calcolo simbolico) Linguaggio di programmazione interpretato 1 Matlab (abbreviazione di Matrix Laboratory) è un ambiente per il calcolo numerico e l analisi statistica che compre 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 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) 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 ve 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 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 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 Interfaccia utente di Matlab Lista variabili Storia comandi Finestra comandi Command Window Current directory Browser 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 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 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 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 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 (dipe 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 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) 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 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] 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 racchiudoli 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 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] 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 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 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 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] 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 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 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 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 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 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') 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 Definizione di funzioni Una funzione è una sequenza di istruzioni identificata con un nome e dotata di uno spazio delle variabili indipente (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) 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 indipenza 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 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) 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 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 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; risultato = x^2;

Slide 18 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); 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 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 Espressioni condizionali: IF if espressione1 istruzioni1 elseif espressione2 istruzioni2 else istruzioni3 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 inte 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 scrivoli tutti in maiuscolo

Slide 21 Esempio di istruzione IF if a ~= 0 % ~= diverso, == test ugualianza b = 1/a else b = NaN % Not-a-Number 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

Slide 22 Espressioni condizionali: SWITCH switch switch_expr case case_expr, istruzione,..., istruzione case {case_expr1, case_expr2,...} istruzione,..., istruzione otherwise, istruzione,..., istruzione 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 Esempio di istruzione SWITCH METHOD = 'Bilinear'; switch lower(method) case {'linear','bilinear'} disp( Metodo lineare.') case 'cubic' disp( Metodo cubico.') otherwise disp('metodo sconosciuto.') 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.')

Slide 24 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! 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 Ciclo FOR Esegue un blocco di codice per un numero di volte specificato for variabile = initval:val istruzione,..., istruzione 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 Le colonne di espressione vengono assegnate, una alla volta, a variabile e vengono eseguite ripetutamente le istruzioni comprese fino a. 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();

Slide 26 Esempio ciclo FOR i = 1 for x = -5:0.1:5 y(i) = x^2 i = i + 1 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;

Slide 27 Ciclo WHILE Esegue ripetutamente un blocco di istruzioni finché una condizione è vera while espressione istruzioni 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 Esempio ciclo WHILE divido = 4567 divisore = 37 quoziente = 0 resto = divido while resto > divisore resto = resto - divisore quoziente = quoziente + 1 28 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

Slide 29 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. 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

Slide 30 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 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 RETURN Interrompe l'esecuzione di una funzione Esempio: function d = mydet(a) if isempty(a) d = 1; return else... 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 END Termina lo spazio d azione delle istruzioni for, while, switch, (try) e if. Senza le istruzioni for, while, switch, (try) e if attono un input ulteriore, l interprete Matlab/Octave risulta bloccato fino a che non riceverà l ultimo degli mancanti. Ciascun viene accoppiato al più vicino non accoppiato for, while, switch, (try) e if e serve per terminarne lo spazio d azione. 32 Nella pratica capita spesso di dover mettere due o tre consecutivi, in questi casi è facile dimenticare almeno un. Il principiante potrebbe avere l'impressione che l'interfaccia di Matlab/Octave sia bloccata, ma aggiungo tutti gli che servono si torna alla situazione normale. L identazione riduce di molto il rischio di questo errore.

Slide 33 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 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 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} 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 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 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 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) 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)) 3 sprintf('%s','hello') 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 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 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 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) 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 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); disp(paga); 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 Esempio, prima variante Costruire la funzione Matlab che in ingresso abbia il nome di una calciatore, un vettore contenente gli stipi 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. 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 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; 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 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)]) 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 Esempio, seconda variante Costruire la funzione Matlab che in ingresso abbia il nome di una squadra, un vettore contenente gli stipi 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. 43 A differenza dell'esempio precedente si deve trovare tutti i giocatori stipiati 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 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; ; 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 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. 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 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; 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 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; if trovato==0 somme{s+1,1} = lista{i,2}; somme{s+1,2} = paghe(i); 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 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)