Le funzioni in Matlab

Da Bioingegneria Elettronica e Informatica.

Vitoantonio Bevilacqua vitoantonio.bevilacqua@poliba.it

Antonio Brunetti antonio.brunetti@poliba.it

Gianpaolo Francesco Trotta gianpaolofrancesco.trotta@poliba.it

Sommario. Il presente paragrafo si riferisce alle lezioni del I Modulo di Informatica : Fondamenti di Informatica per il nuovo corso di laurea triennale in Ingegneria dei Sistemi Medicali del Dipartimento di Ingegneria Elettrica e dell'Informazione del Politecnico di Bari.

Parole chiave: Funzioni, Dichiarazione di una funzione, Chiamata di una funzione.

ATTENZIONE !!! - PAGINA IN ALLESTIMENTO

Introduzione

È possibile unire gruppi di istruzioni per formare delle "funzioni" usate per evitare di replicare porzioni di codice sorgente più volte. Invocare una funzione significa mandare in esecuzione la porzione di codice che la costituisce. Se una funzione è invocata più volte, allora la porzione di codice è eseguita più volte: il vantaggio è dunque quello di poter avere tante chiamate ma una sola porzione di codice.

Dichiarazione e definizione di una funzione

In Matlab è possibile dichiarare una funzione nel seguente modo:

function [y1,...,yN] = nomeFunzione (x1,...,xM)

Il codice precedente dichiara una funzione chiamata nomeFunzione che accetta come ingresso (dominio) M variabili x1,...,xM e restituisce come uscita (codominio) N variabili y1,...,yN.

Chiamata di una funzione

Una volta dichiarato il prototipo e definita la funzione, è possibile richiamare la stessa in qualsiasi script (avendo cura di rispettare il dominio e il codominio definito). Per esempio, nel seguente blocco di codice è richiamata la funzione nomefunzione:

[y1,...,yN] = nomeFunzione (x1,...,xM);

Esempi Applicativi

Doppio di un numero

Si vuole realizzare una funzione che sia in grado di calcolare il doppio di un numero.

Innanzitutto è necessario dichiarare e definire la funzione. A tal proposito, supponendo che la funzione che stiamo creando si chiami doppio, è necessario creare un file .m che abbia lo stesso nome della funzione. In questo caso, quindi, il seguente blocco di codice sarà contenuto all'interno del file doppio.m

  1. function [ D ] = doppio ( A )
  2. % Doppio funzione per raddoppiare il valore una variabile
  3. %   Non ci sono ulteriori dettagli
  4.  
  5.     D = 2*A;
  6.  
  7. end

Di seguito, invece, uno script di esempio in cui si va a richiamare la funzione che abbiamo appena definito.

  1. %% Script per la dimostrazione di una chiamata di funzione
  2. A = 3;
  3. A = doppio(A);
  4.  
  5. % A questo punto, la chiamata a disse mostrerà il valore di A raddoppiato, quindi 6
  6. disp(A);

Ordinamento di un vettore

Riprendiamo l'esempio relativo al Selection Sort e strutturiamolo in modo tale che sia formato da funzioni preposte ad assolvere determinati task.

Per fare ciò, dichiariamo e definiamo le funzioni di acquisizione degli elementi del vettore, ordinamento del vettore e stampa degli elementi del vettore.

La prima funzione si chiama acquisisci_elementi; quindi creiamo il file acquisisci_elementi.m

  1. function [ V ] = acquisisci_elementi ( V, dim )
  2. % acquisiti_elementi funzione per acquisire da tastiera le componenti del vettore
  3. %   La funzione accetta 2 parametri, V è il vettore da riempire, mentre dim è la dimensione del vettore.
  4. %   La funzione restituisce il vettore con gli elementi inseriti.
  5.  
  6.     % Acquisizione da tastiera delle componenti del vettore
  7.     for i = 1 : dim
  8.         V(i) = input('');
  9.     end
  10.  
  11. end

La seconda funzione che dichiariamo e definiamo è la funzione di ordinamento. Con la stessa logica precedente, creiamo il file ordina.m

  1. function [ V ] = ordina( V, dim )
  2. %ordina funzione che implementa l'algoritmo del selection sort
  3. %   La funzione accetta 2 parametri (il vettore da ordinare e la sua dimensione) e restituisce il vettore ordinato
  4.  
  5.     % ATTENZIONE ! - Per accedere alle componenti di
  6.     % vettori e matrici l'indice deve iniziare da 1
  7.     i = 1;
  8.     flag = true;
  9.     while flag == true
  10.         i_min = i;
  11.         j = i+1;
  12.  
  13.         % Essendoci un blocco while annidato, ho la necessità di utilizzare un
  14.         % secondo flag
  15.         flag1 = true;
  16.         while flag1 == true
  17.             % Controllo se l'elemento corrente è minore di quello considerato
  18.             % come minimo
  19.             if V(j) < V(i_min)
  20.                 % Se vero, aggiorno l'indice dell'elemento minimo
  21.                 i_min = j;
  22.             end
  23.  
  24.             j = j+1;
  25.             % Attenzione alla condizione; è utilizzato il <= perchè in Matlab
  26.             % il primo elemento del vettore ha indice 1, mentre l'ultimo avrà
  27.             % indice pari a dim
  28.             flag1 = j<=dim;
  29.         end
  30.  
  31.         % Blocco di codice relativo allo scambio
  32.         temp = V(i);
  33.         V(i) = V(i_min);
  34.         V(i_min) = temp;
  35.  
  36.         i = i+1;
  37.         flag = i <=(dim-1);
  38.     end
  39.  
  40. end

L'ultima funzione si chiama stampa_elementi; quindi creiamo il file stampa_elementi.m

  1. function [ ] = stampa_elementi ( V, dim )
  2. % stampa_elementi funzione per stampare a video le componenti del vettore
  3. %   La funzione accetta 2 parametri, V è il vettore da stampare, mentre dim è la dimensione del vettore. 
  4. %    In questo caso la funzione non restituisce niente
  5.  
  6.     % Stampa a video delle componenti del vettore
  7.     for i = 1 : dim
  8.         disp(V(i));
  9.     end
  10.  
  11. end