Sei sulla pagina 1di 30

Matlab – 5

Funzioni
Slide basate sul corso di C. Blundo

A.A. 2010/2011 -- Laboratorio di Informatica per


GPersiano Fisici 1
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 funzione
I 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 funzione
Questa riga distingue uno script da una funzione
function [variabili output] = NomeFunzione(variabili input)
Tra parentesi tonde sono racchiuse le
variabili di input
Tra parentesi quadre sono racchiuse le
variabili di output
Una funzione può restituire più valori
function [s,p] = sompro(a,b)
Esempi s=a+b;
p=a.*b;
function [s] = somma(a,b)
s=a+b;
>> sompro(3,4)
ans =
>> somma(4,5) 7
ans = >> [x,y]=sompro(3,4)
9 x=
>> d=somma(3,7) 7
d= y=
10 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 Workspace
Se 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 >> x=1;
>> y=2;
function [x] = locale(y) >> z=locale(3)
y=y+2; z=
x=y; 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
funzioni
La dichiarazione globale deve essere posizionata
prima che la variabile venga utilizzata nella
funzione
Il 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 accessibile
Se si vuole usare la variabile globale anche nel
Workspace, allora si deve ripetere la
dichiarazione globale anche dalla linea di
comando
In una funzione definita dall’utente il comando
global deve essere la prima riga eseguibile
Esempio >> global x
>> x=1;
function globale1(y) >> globale1(5)
global x >> x
x=y+1; x=
6
function globale2(y) >> globale2(5)
global x >> x
x=y+2; x=
7
Handle di funzione
Un handle di una funzione f è un modo
per far riferimento alla funzione f stessa
Tipicamente 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’handle
Per 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 = @sin
feval(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)
Esempio
function 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 è vera
I costrutti opzionali else ed elseif
permettono l’esecuzione di gruppi di
istruzioni alternative
La parola chiave end indica che l’ultimo
gruppo di istruzioni è terminato
Esempio – 1 function pariDispari(n)
if rem(n,2) == 0

if espressione disp('Il numero è pari')


istruzioni else
elseif espressione disp('Il numero è dispari')
istruzioni end
else
istruzioni
>> pariDispari(2)
end
Il numero è pari
>> pariDispari(3)
Il numero è dispari
Esempio – 2
function segno(n)
if n < 0 >> segno(9)

disp('Il numero è negativo') Il numero è positivo

elseif n>0 >> segno(-3)

disp('Il numero è positivo') Il numero è negativo

else >> segno(0)

disp('Il numero è zero') Il numero è zero

end
Funzioni su matrici
Le 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 è valore1
case value2
istruzioni % Eseguite se espressione è valore2
.
.
.

otherwise
istruzioni % 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 case
Per 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 >> verifica(0)
case -1 zero
disp('negativo');
case 0 >> verifica(1)
disp('zero'); positivo
case 1
disp('positivo'); >> verifica(-1)
otherwise negativo
disp('non è –1, 0 o 1');
end >> verifica(12)
non è 1, 0 o 1
Esempio – 2
function mesi(s)
switch s
case 'gennaio'
>> mesi('e')
disp('gennaio ha 31 giorni')
case 'febbraio' Non hai immesso un mese
disp('febbraio ha 28 o 29 giorni') >> mesi('febbraio')
case 'marzo'
febbraio ha 28 o 29 giorni
disp('marzo ha 31 giorni')
otherwise >> mesi('marzo')
disp('Non hai immesso un mese') marzo ha 31 giorni
end
Nota
Il costrutto switch può gestire condizioni multiple
in una singola clausola case racchiudendo i valori
della clausola case in un array cella
switch var
case 1
disp('1')
case {2,3,4}
disp('2 o 3 o 4')
case 5
disp('5')
otherwise
disp('Altro numero')
end
Nota sulle stringhe
Le stringhe sono rappresentate in
Matlab da una serie di caratteri
racchiusi tra apici
Matlab vede una stringa come un
vettore
Possiamo accedere all’i-esimo carattere
della stringa s scrivendo s(i)
Per estrarre delle sottostringhe possiamo
usare opportunamente l’operatore :

Potrebbero piacerti anche