Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide...
Transcript of Matlab – 5 - UNISAlibeccio.di.unisa.it/LabInf2010/Matlab 5.pdf · Matlab – 5 Funzioni Slide...
A.A. 2010/2011 -- GPersiano
Laboratorio di Informatica per Fisici 1
Matlab – 5
FunzioniSlide basate sul corso di C. Blundo
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
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
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
Esempi
function r = sompro(a,b)
s=a+b;
p=a.*b;
r = [s, p];
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
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
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
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
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
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
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)
Esempiofunction plot_fhandle(fhandle, data)
plot(data, feval(fhandle, data)
>> d=-pi:0.1:pi;
>> f=@sin
>> plot_fhandle(f,d)
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;
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)
Esempio
function myplot(x,varargin)
plot(x,varargin{:})
myplot(sin(0:.1:1),'color',[.5 .7 .3],'linestyle',':')
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
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
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
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
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
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
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)
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, …
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
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
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
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
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
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 :