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)