Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide...

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

Transcript of Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide...

Page 1: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

A.A. 2010/2011 -- GPersiano

Laboratorio di Informatica per Fisici 1

Matlab – 5

FunzioniSlide basate sul corso di C. Blundo

Page 2: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Funzioni

Le funzioni sono utili quando occorre ripetere una serie di comandi più volte

Le variabili in un M-file che definisce una funzione sono locali alla funzioneI loro valori sono disponibili solo all’interno della funzione stessa

Page 3: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Funzioni: sintassi – 1

La prima riga di una funzione deve iniziare con la definizione della funzioneQuesta riga distingue uno script da una funzione

function [variabili output] = NomeFunzione(variabili input)

Tra parentesi tonde sono racchiuse le variabili di inputTra parentesi quadre sono racchiuse le variabili di output

Una funzione può restituire più valori

Page 4: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Esempi

function [s] = somma(a,b)

s=a+b;

>> somma(4,5)

ans =

9

>> d=somma(3,7)

d =

10

function [s,p] = sompro(a,b)

s=a+b;

p=a.*b;

>> sompro(3,4)

ans =

7

>> [x,y]=sompro(3,4)

x =

7

y =

12

Page 5: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Esempi

function r = sompro(a,b)

s=a+b;

p=a.*b;

r = [s, p];

Page 6: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Variabili locali

Una variabile utilizzata all’interno di una funzione è locale alla funzioneÈ “indipendente” dalle variabili definite nel WorkspaceSe esiste nel Workspace una variabile di che ha lo stesso nome di una locale, allora una qualsiasi modifica di quella locale non influenza quella definita nel Workspace

Page 7: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Esempio

function [x] = locale(y)

y=y+2;

x=y;

>> x=1;

>> y=2;

>> z=locale(3)

z =

5

>> x

x =

1

>> y

y =

2

Page 8: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Variabili globali – 1

Se si vuole che alcune funzioni condividano una singola copia di una variabile, è sufficiente dichiarare come globale (global) quella variabile in tutte le funzioniLa dichiarazione globale deve essere posizionata prima che la variabile venga utilizzata nella funzioneIl valore assegnato alla variabile globale è accessibile a qualsiasi funzione che dichiara quella variabile come globale

Page 9: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Variabili globali – 2

Si può modificare il valore di una variabile globale in qualsiasi punto essa sia accessibileSe si vuole usare la variabile globale anche nel Workspace, allora si deve ripetere la dichiarazione globale anche dalla linea di comandoIn una funzione definita dall’utente il comando global deve essere la prima riga eseguibile

Page 10: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Esempio

function globale1(y)

global x

x=y+1;

function globale2(y)

global x

x=y+2;

>> global x

>> x=1;

>> globale1(5)

>> x

x =

6

>> globale2(5)

>> x

x =

7

Page 11: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Handle di funzione

Un handle di una funzione f è un modo per far riferimento alla funzione f stessaTipicamente un handle ad una funzione f viene essere passato come argomento di un’altra funzione g che può eseguire o valutare la funzione f attraverso l’handlePer costruire in Matlab un handle di una funzione si fa precedere il nome della funzione dal simbolo @ fhandle = @sin

Page 12: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Il comando feval

Il comando feval valuta la funzione specificata come argomento tramite un handle sugli altri argomenti

fhandle = @sinfeval(fhandle, -pi:0.1:pi)

Si può scrivere facilmente una funzione plot_fhandle che riceve un handle di funzione e dei dati, dopo disegna il grafico della funzione (usa feval)

Page 13: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Esempiofunction plot_fhandle(fhandle, data)

plot(data, feval(fhandle, data)

>> d=-pi:0.1:pi;

>> f=@sin

>> plot_fhandle(f,d)

Page 14: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Nota

Per passare una funzione come parametro input della funzione plot_fhandle si deve scrivere una funzione Matlab che rappresenta la funzione da disegnare

function y=polinomio(x)

y=3*x.^2+3*x-4;

Page 15: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Altre caratteristiche delle funzioni

La variabile nargin conserva il numero dei parametri input della funzione

La variabile nargout conserva il numero dei parametri output della funzione

Per scrivere una funzione con un numero variabile di parametri input/output si devono usare come ultimo argomento le variabili varargin/varargout (var arg in/out)

Page 16: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Esempio

function myplot(x,varargin)

plot(x,varargin{:})

myplot(sin(0:.1:1),'color',[.5 .7 .3],'linestyle',':')

Page 17: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Strutture di controllo

Matlab ha alcuni costrutti di controllo di flusso

if … elseif … else … end switch … case … otherwise … end for … end while … end continue, break, return

Page 18: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

if … elseif … else … end

Il costrutto if valuta un’espressione logica ed esegue un gruppo di istruzioni quando l’espressione è veraI costrutti opzionali else ed elseif permettono l’esecuzione di gruppi di istruzioni alternativeLa parola chiave end indica che l’ultimo gruppo di istruzioni è terminato

Page 19: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Esempio – 1 function pariDispari(n)

if rem(n,2) == 0

disp('Il numero è pari')

else

disp('Il numero è dispari')

end

>> pariDispari(2)

Il numero è pari

>> pariDispari(3)

Il numero è dispari

if espressione

istruzioni

elseif espressione

istruzioni

else

istruzioni

end

Page 20: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Esempio – 2

function segno(n)

if n < 0

disp('Il numero è negativo')

elseif n>0

disp('Il numero è positivo')

else

disp('Il numero è zero')

end

>> segno(9)

Il numero è positivo

>> segno(-3)

Il numero è negativo

>> segno(0)

Il numero è zero

Page 21: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Funzioni su matriciLe seguenti funzioni sono utili quando si usano matrici/vettori all’interno di una condizione per l’if o elseif isequal(A,B)

• Restituisce true se A e B sono identici

isempty(A)• Restituisce true se A è vuto

all(A)• Restituisce true se tutti gli elementi del vettore sono

diversi da zero

any(A)• Restituisce true se almeno un elemento del vettore è

diverso da zero

Page 22: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Altre funzioni – 1

ischar(s)Restituisce true se s è una stringa

isnumeric(n)Restituisce true se n è un numero. Si può applicare anche ai vettori

strcat(s1, s2, …, sn)Concatena le stringhe s1, s2, …, sn

strcmp(s1, s2)Restituisce true se s1 ed s2 sono uguali

Page 23: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Altre funzioni – 2

lower(s)Converte i caratteri della stringa s in minuscolo

upper(s)Converte i caratteri della stringa s in maiuscolo

num2str(n)Converte il numero n in una stringa

int2str(i)Converte l’intero i in una stringa (non considera le cifre dopo la virgola)

Page 24: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

switch … case … otherwise … end

Lo switch esegue una serie di istruzioni sulla base del valore di una variabile o espressione

È utilizzato per semplificare una serie di if in cascata

Ad esempio vogliamo controllare se una variabile è uguale ad 1, oppure a 2, oppure a 3, oppure a 4, …

Page 25: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Sintassi switch

switch espressione % (scalare o stringa)case valore1

istruzioni % Eseguite se espressione è valore1case value2

istruzioni % Eseguite se espressione è valore2...

otherwiseistruzioni % Eseguite se espressione non corrisponde % a nessuno dei casi precedenti

end

Page 26: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Note

Il costrutto switch funziona confrontando l’espressione input con ognuno dei valori indicati nella clausola casePer espressioni numeriche, una clausola case è vera se valore==espressione

Per espressioni di tipo stringa, una clausola case è vera se strcpm(valore,espressione) restituisce true

Page 27: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Esempio – 1 switch numero

case -1disp('negativo');case 0disp('zero');case 1disp('positivo');otherwisedisp('non è –1, 0 o 1');

end

>> verifica(0)

zero

>> verifica(1)

positivo

>> verifica(-1)

negativo

>> verifica(12)

non è 1, 0 o 1

Page 28: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Esempio – 2

function mesi(s)switch scase 'gennaio' disp('gennaio ha 31 giorni')case 'febbraio' disp('febbraio ha 28 o 29 giorni')case 'marzo' disp('marzo ha 31 giorni')otherwise disp('Non hai immesso un mese')end

>> mesi('e')

Non hai immesso un mese

>> mesi('febbraio')

febbraio ha 28 o 29 giorni

>> mesi('marzo')

marzo ha 31 giorni

Page 29: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

NotaIl costrutto switch può gestire condizioni multiple in una singola clausola case racchiudendo i valori della clausola case in un array cella switch var

case 1disp('1')case {2,3,4}disp('2 o 3 o 4')case 5disp('5')otherwisedisp('Altro numero')

end

Page 30: Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide basate sul corso di C. Blundo. Funzioni Le funzioni sono utili quando occorre ripetere

Nota sulle stringhe

Le stringhe sono rappresentate in Matlab da una serie di caratteri racchiusi tra apiciMatlab vede una stringa come un vettorePossiamo accedere all’i-esimo carattere della stringa s scrivendo s(i)Per estrarre delle sottostringhe possiamo usare opportunamente l’operatore :