Sei sulla pagina 1di 18

Strumenti  per  il  calcolo  numerico

MATLAB/Octave  
Funzioni

Informatica  B
Prologo

Data  una matrice M  di  valori positivi,  si  individui  la  


colonna  di  M  con  il  maggior  numero  di  valori  pari  e  
stampi  a  video  tale  numero  (si  veda  la  lezione  
precedente)

N = ~mod(M, 2);
A = sum(N);
Funzioni offerte da  MATLAB
maxVal = max(A);

disp(['il maggior numero di numeri pari per colonna e` ',


…num2str(maxVal)]);

-2-
Prologo

Se  decidiamo  di  fare  a  meno  di  alcune  delle  funzioni,  


per  es,  sum  e  max:
% uso di A
A = zeros(C);
for jj=1:C
for ii=1:R
if (mod(M(ii,jj), 2)==0)
A(jj)++;
end
end
end
maxVal = A(1);
for ii=2:C
if (A(ii)>maxVal)
maxVal=A(ii);
end
end
-3-
Vantaggio  derivanti  dall’uso  delle  funzioni

Riusabilità
Meno  fatica  per  il  programmatore  
Astrazione  
Esprimere  in  modo  sintetico  operazioni  complesse
Programma  più  leggibile
Estendibilità  del  linguaggio  
Non  tutte  operazioni  incluse  come  predefinite

-4-
Funzioni
Assomigliano  a  interi  programmi  ma  sono  “asserviti”
ad  altri  programmi  
Per  ogni  funzione  deve  essere  definito
Quale  operazione  astratta  realizza
Come  può  essere  identificato  dal  programma  
principale
Quali  parametri  coinvolge  
Dati  in  ingresso  come  punto  di  partenza  dei  calcoli  
(dominio  della  funzione)
Valori  restituiti  ai  programmi  che  lo  usano  (codominio  
della  funzione)
Un  sottoprogramma  definito  può  essere  utilizzato dal  
programma  principale  
L’utilizzo  è  detto  chiamata  (o  invocazione)  del  
sottoprogramma -5-
Definizione  di  una  funzione
Esempio:  funzione fact  per  il calcolo del  fattoriale
function  [f]=fact(n)
f=1;;
for  k=1:n Testata o intestazione

f=f*k;; Corpo: è la parte eseguibile


end
La  testata contiene informazioni rilevanti per  uso corretto del  
sottoprogramma
lista dei risultati,  tra parentesi quadre,  separati da  ‘,’  
matematicamente,  il codominio della funzione
nome del  sottoprogramma
lista degli argomenti,  tra parentesi tonde,  separati da  ‘,’  
matematicamente,  il dominio della funzione

-6-
Invocazione  di  una  funzione

>>  x=fact(4)
x  =24
Sintassi dell’invocazione ispirata a  notazione
matematica
una funzione,  applicata a  suoi argomenti,  fornisce un  
valore del  suo codominio
chiamata di  funzione sintatticamente è un’espressione
>>  x=fact(2)+fact(3)
x  =  8
>>  fact(fact(3))
ans =  720

-7-
Sintassi  dell’invocazione  di  una  funzione  
(1)

Nel  caso  di  più  parametri  in  uscita,  risultati  “raccolti”  usando  la  notazione  dei  vettori  

Chiamata di  sumProd Definizione di  sumProd

>>  [x,y]=sumProd(4,5) function  [s,p]=sumProd(a,b)


x  =  9 s=a+b;;
y  =  20 p=a*b;;

Identificatore della funzione Lista dei parametri formali

Lista dei parametri attuali racchiusa fra parentesi tonde.  

Ogni parametro è un’espressione qualsiasi (di  tipo appropriato…).


Può essere anche una chiamata di  funzione come  nella pagina precedente!  

-8-
Sintassi  dell’invocazione  di  una  funzione  (2)

Se  ci  sono  più  parametri,  la  corrispondenza  tra    


formali  e  attuali  determinata  dall’ordine  
primo  formale   primo  attuale
secondo  formale   secondo  attuale etc.
numero  parametri  attuali  =  numero  parametri  
formali
ovviamente,  tipo  dei  parametri  attuali  compatibile  con  
tipo  dei  formali

-9-
Comportamento dell’interprete MATLAB  
quando viene invocata una funzione
§ Consideriamo il seguente esempio
>>  x=fact(3) function  [f]=fact(n)
f=1;;
x  =  6 for  k=1:n
>>  y=fact(2)  +  x f=f*k;;
end
y  =  8
§ Diverse  macchine astratte
§ Una per  l’esecuzione del  programma chiamante
§ Una per  ciascuna invocazione di  funzione
§ Ciascuna dotata di  un  proprio ambiente di  
esecuzione in  cui  vengono definite  le  proprie variabili

- 10 -
Prima  invocazione ed esecuzione di  fact  (1)

2. Ambiente di fact al 3. Ambiente di fact al


1. Ambiente di fact al momento dell’esecuzione momento del termine
momento della chiamata della prima istruzione di fact della prima iterazione del for
n 3 n 3 n 3
f f 1 f 1
k 2

x x x

Ambiente dello Ambiente dello Ambiente dello


script chiamante script chiamante script chiamante

L’ambiente dello script chiamante non si modifica durante l’esecuzione di fact


perchè la macchina astratta corrispondente è bloccata in attesa che l’altra termini
l’esecuzione di fact
Prima  invocazione ed esecuzione di  fact  (1)

4. Ambiente di fact al 5. Ambiente di fact al


momento del termine momento del termine
della seconda iterazione del for della terza iterazione del for
n 3 n 3
L’esecuzione di fact termina qui.
f 2 f 6 L’interprete MATLAB copia il valore
di f nell’ambiente del chiamante, in x
k 3 k 4

x x x 6

Ambiente dello Ambiente dello Ambiente dello


script chiamante script chiamante script chiamante al termine
della prima invocazione di fact

- 12 -
Seconda invocazione ed esecuzione di  fact  (1)

2. Ambiente di fact al 3. Ambiente di fact al


1. Ambiente di fact al momento dell’esecuzione momento del termine
momento della chiamata della prima istruzione di fact della prima iterazione del for
n 2 n 2 n 2
f f 1 f 1
k 2

x 6 x 6 x 6
y y y

Ambiente dello Ambiente dello Ambiente dello


script chiamante script chiamante script chiamante

L’ambiente della seconda chiamata a fact è indipendente da quello della prima


Seconda invocazione ed esecuzione di  fact  (2)

4. Ambiente di fact al
momento del termine
della seconda iterazione del for
L’esecuzione di fact termina qui.
n 2 L’interprete MATLAB copia il valore
f di f nell’ambiente del chiamante, lo
2 somma al valore di x e mette il risultato
k in y
3

x 6 x 6
y y 8

Ambiente dello Ambiente del chiamante


script chiamante al termine della seconda
invocazione di fact

L’ambiente della seconda chiamata a fact è indipendente da quello della prima


Ambienti di  esecuzione

Ambienti della macchina del chiamante e di quella della


chiamata a funzione sono disgiunti
Comunicano attraverso i parametri
possono contenere variabili omonime, che rimangono
distinte
NB: dopo esecuzione di una funzione non rimane traccia
del suo ambiente

- 15 -
Invocazione di  una funzione con  più
parametri
Esempio function [M, m]=MCDmcm(a, b)
>>  r=12;;  s=42;;  [h,k]=MCDmcm(r,  s) x=a; y=b;
while x ~= y
h =  6 if x>y x=x-y;
else y=y-x;
k =  84 end;
end;
M=x;
m=a*b/M;

- 16 -
Invocazione di  una funzione con  più parametri
Sequenza nell’esecuzione di [h,k]=MCDmcm(r, s)

MCDmcm x:… y:… MCDmcm x:… y:…

a:… b:… M:.. m:… a:12 b:42 M: m:

r:12 s:42 h:… k:… r:12 s:42 h:… k:… r:12 s:42 h:… k:…

principale principale principale

(1) (2) (3)

MCDmcm x: 6 y: 6 MCDmcm x: 6 y: 6 MCDmcm x: 6 y: 6

a:12 b:42 M:6 m:84 M:12 m:42 M:6 m:84 M:12 m:42 M:6 m:84

r:12 s:42 h:… k:… r:12 s:42 h:6 k:84 r:12 s:42 h:6 k:84

principale principale principale

(4) (5) (6)

17
Organizzazione  delle  funzioni  in  MATLAB
In  un  M-­file  di  tipo particolare detto “file  di  funzione”
Ha  estensione “.m”  come  i file  di  script
File  di  funzione deve
avere stesso nome della funzione che contiene
iniziare con  la  definizione della funzione (NB:  parola
function  va in  minuscolo)
trovarsi in  una cartella che sta nel PATH  di  MATLAB
Per  evitare conflitti di  nomi usare
exist(‘nomeFunzione’)
restituisce 0  se  la  funzione non  esiste,  ≠0  altrimenti
es.  ‘sin’  è una funzione predefinita (built-­in)
>>  exist('sin')
ans =  5  
- 18 -

Potrebbero piacerti anche