Le funzioni in Matlab: differenze tra le versioni

Da Bioingegneria Elettronica e Informatica.
m (Profbevilacqua ha spostato la pagina Le funzioni a Le funzioni in Matlab senza lasciare redirect: Cambio Nome)
 
(21 versioni intermedie di uno stesso utente non sono mostrate )
Riga 4: Riga 4:
  
 
'''Gianpaolo Francesco Trotta''' [mailto:gianpaolofrancesco.trotta@poliba.it  gianpaolofrancesco.trotta@poliba.it]
 
'''Gianpaolo Francesco Trotta''' [mailto:gianpaolofrancesco.trotta@poliba.it  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.
 
''Parole chiave:'' Funzioni, Dichiarazione di una funzione, Chiamata di una funzione.
 
<pre style="color: red">ATTENZIONE !!! - PAGINA IN ALLESTIMENTO</pre>
 
  
 
== Introduzione ==
 
== Introduzione ==
Riga 23: Riga 19:
  
 
== Chiamata di una funzione ==
 
== 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). Peresmpio, nel seguente blocco di codice è richiamata la funzione ''nomefunzione'':
+
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'':
 
<div align="center">
 
<div align="center">
 
<code>[y1,...,yN] = nomeFunzione (x1,...,xM);</code>
 
<code>[y1,...,yN] = nomeFunzione (x1,...,xM);</code>
 
</div>
 
</div>
 +
 +
== 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
 +
<syntaxhighlight lang="matlab" line>
 +
function [ D ] = doppio ( A )
 +
% Doppio funzione per raddoppiare il valore una variabile
 +
%  Non ci sono ulteriori dettagli
 +
 +
    D = 2*A;
 +
 +
end
 +
</syntaxhighlight>
 +
 +
Di seguito, invece, uno script di esempio in cui si va a richiamare la funzione che abbiamo appena definito.
 +
<syntaxhighlight lang="matlab" line>
 +
%% Script per la dimostrazione di una chiamata di funzione
 +
A = 3;
 +
A = doppio(A);
 +
 +
% A questo punto, la chiamata a disse mostrerà il valore di A raddoppiato, quindi 6
 +
disp(A);
 +
</syntaxhighlight>
 +
 +
=== Ordinamento di un vettore ===
 +
Riprendiamo l'esempio relativo al [http://www.vitoantoniobevilacqua.it/wiki/index.php?title=Diagrammi_di_flusso_e_Codice_Matlab#Ordinamento_degli_elementi_di_un_vettore 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'''
 +
<syntaxhighlight lang="matlab" line>
 +
function [ V ] = acquisisci_elementi ( V, dim )
 +
% acquisiti_elementi funzione per acquisire da tastiera le componenti del vettore
 +
%  La funzione accetta 2 parametri, V è il vettore da riempire, mentre dim è la dimensione del vettore.
 +
%  La funzione restituisce il vettore con gli elementi inseriti.
 +
 +
    % Acquisizione da tastiera delle componenti del vettore
 +
    for i = 1 : dim
 +
        V(i) = input('');
 +
    end
 +
 +
end
 +
</syntaxhighlight>
 +
 +
La seconda funzione che dichiariamo e definiamo è la funzione di ordinamento. Con la stessa logica precedente, creiamo il file '''ordina.m'''
 +
<syntaxhighlight lang="matlab" line>
 +
function [ V ] = ordina( V, dim )
 +
%ordina funzione che implementa l'algoritmo del selection sort
 +
%  La funzione accetta 2 parametri (il vettore da ordinare e la sua dimensione) e restituisce il vettore ordinato
 +
 +
    for i = 1 : dim-1
 +
        i_min = i;
 +
        j = i+1;
 +
        for j = j : dim
 +
            if V(j) < V(i_min)
 +
                % Se vero, aggiorno l'indice dell'elemento minimo
 +
                i_min = j;
 +
            end
 +
        end
 +
 +
        % Blocco di codice relativo allo scambio
 +
        temp = V(i);
 +
        V(i) = V(i_min);
 +
        V(i_min) = temp;
 +
    end
 +
end
 +
</syntaxhighlight>
 +
 +
L'ultima funzione si chiama stampa_elementi; quindi creiamo il file '''stampa_elementi.m'''
 +
<syntaxhighlight lang="matlab" line>
 +
function [ ] = stampa_elementi ( V, dim )
 +
% stampa_elementi funzione per stampare a video le componenti del vettore
 +
%  La funzione accetta 2 parametri, V è il vettore da stampare, mentre dim è la dimensione del vettore.
 +
%    In questo caso la funzione non restituisce niente
 +
 +
    % Stampa a video delle componenti del vettore
 +
    for i = 1 : dim
 +
        disp(V(i));
 +
    end
 +
 +
end
 +
</syntaxhighlight>
 +
 +
Infine lo script completo in cui vengono richiamati le funzioni appena create.
 +
<syntaxhighlight lang="matlab" line>
 +
%% Codice per l'ordinamento in ordine crescente degli elementi di un vettore utilizzando l'algoritmo del selection sotrt
 +
 +
% Acquisisco da tastiera la dimensione del vettore
 +
% controllando che sia un numero compreso tra 5 e 10 (estremi inclusi)
 +
N = 0;
 +
flag = true;
 +
while flag == true
 +
  N = input('');
 +
 
 +
  flag = N < 5 || N > 10 ;
 +
end
 +
 +
% Creazione del vettore vuoto
 +
V = [];
 +
 +
% Acquisizione da tastiera delle componenti del vettore
 +
V = acquisisci_elementi(V, N);
 +
 +
% Prima stampa a video degli elementi del vettore
 +
stampa_elementi(V,N);
 +
 +
% Ordinamento del vettore
 +
V = ordina(V,N);
 +
 +
% Seconda stampa a video degli elementi del vettore
 +
stampa_elementi(V,N);
 +
</syntaxhighlight>
 +
 +
=== Fusione di due vettori ordinati ===
 +
Riprendiamo l'esempio relativo al [http://www.vitoantoniobevilacqua.it/wiki/index.php?title=Diagrammi_di_flusso_e_Codice_Matlab#Algoritmo_Merge_Sort Merge 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 dei vettori, ordinamento, fusione e stampa degli elementi del vettore.
 +
 +
La prima funzione si chiama acquisisci_elementi; quindi creiamo il file '''acquisisci_elementi.m'''
 +
<syntaxhighlight lang="matlab" line>
 +
function [ V ] = acquisisci_elementi ( V, dim )
 +
% acquisiti_elementi funzione per acquisire da tastiera le componenti del vettore
 +
%  La funzione accetta 2 parametri, V è il vettore da riempire, mentre dim è la dimensione del vettore.
 +
%  La funzione restituisce il vettore con gli elementi inseriti.
 +
 +
    % Acquisizione da tastiera delle componenti del vettore
 +
    for i = 1 : dim
 +
        V(i) = input('');
 +
    end
 +
 +
end
 +
</syntaxhighlight>
 +
 +
La seconda funzione che dichiariamo e definiamo è la funzione di ordinamento. Con la stessa logica precedente, creiamo il file '''ordina.m'''
 +
<syntaxhighlight lang="matlab" line>
 +
function [ V ] = ordina( V, dim )
 +
%ordina funzione che implementa l'algoritmo del selection sort
 +
%  La funzione accetta 2 parametri (il vettore da ordinare e la sua dimensione) e restituisce il vettore ordinato
 +
 +
    for i = 1 : dim-1
 +
        i_min = i;
 +
        j = i+1;
 +
        for j = j : dim
 +
            if V(j) < V(i_min)
 +
                % Se vero, aggiorno l'indice dell'elemento minimo
 +
                i_min = j;
 +
            end
 +
        end
 +
 +
        % Blocco di codice relativo allo scambio
 +
        temp = V(i);
 +
        V(i) = V(i_min);
 +
        V(i_min) = temp;
 +
    end
 +
end
 +
</syntaxhighlight>
 +
 +
La terza funzione che dichiariamo e definiamo è quella di fusione. Con la stessa logica precedente, creiamo il file '''fondi.m'''
 +
<syntaxhighlight lang="matlab" line>
 +
function [ U ] = fondi( V, W, dimV, dimW, U )
 +
%fondi funzione che implementa l'algoritmo del merge sort
 +
%  La funzione accetta 5 parametri (i 2 vettore ordinati con le relative dimensioni, e il vettore che conterrà la fusione di V e W) e restituisce il vettore fuso
 +
 +
% Inizializzatione delle variabili utili all'algoritmo
 +
i = 1;
 +
j = 1;
 +
k = 1;
 +
 +
flag = true;
 +
while flag == true
 +
    if V(i) < W(j)
 +
        U(k) = V(i);
 +
        i = i+1;
 +
    else
 +
        U(k) = W(j);
 +
        j = j+1;
 +
    end
 +
    k = k+1;
 +
   
 +
    flag = i<= dimV && j <= dimW;
 +
end
 +
 +
if i < dimV
 +
    for i = i : 1 : dimV
 +
        U(k) = V(i);
 +
        k = k+1;
 +
    end
 +
else
 +
    for j = j : dimW
 +
        U(k) = W(j);
 +
        k = k+1;
 +
    end
 +
   
 +
end
 +
 +
</syntaxhighlight>
 +
 +
L'ultima funzione si chiama stampa_elementi; quindi creiamo il file '''stampa_elementi.m'''
 +
<syntaxhighlight lang="matlab" line>
 +
function [ ] = stampa_elementi ( V, dim )
 +
% stampa_elementi funzione per stampare a video le componenti del vettore
 +
%  La funzione accetta 2 parametri, V è il vettore da stampare, mentre dim è la dimensione del vettore.
 +
%    In questo caso la funzione non restituisce niente
 +
 +
    % Stampa a video delle componenti del vettore
 +
    for i = 1 : dim
 +
        disp(V(i));
 +
    end
 +
 +
end
 +
</syntaxhighlight>
 +
 +
Infine lo script completo in cui vengono richiamati le funzioni appena create.
 +
<syntaxhighlight lang="matlab" line>
 +
%% Codice per il merge sort
 +
 +
% Acquisisco da tastiera la dimensione del primo vettore
 +
% controllando che sia un numero compreso tra 5 e 10 (estremi inclusi)
 +
N = 0;
 +
flag = true;
 +
while flag == true
 +
  N = input('');
 +
 
 +
  flag = N < 5 || N > 10 ;
 +
end
 +
 +
% Acquisisco da tastiera la dimensione del secondo vettore
 +
% controllando che sia un numero compreso tra 5 e 10 (estremi inclusi)
 +
M = 0;
 +
flag = true;
 +
while flag == true
 +
  M = input('');
 +
 
 +
  flag = M < 5 || M > 10 ;
 +
end
 +
 +
% Creazione dei vettore vuoti
 +
V = [];
 +
W = [];
 +
U = [];
 +
 +
% Acquisizione da tastiera delle componenti del primo vettore
 +
V = acquisisci_elementi(V, N);
 +
 +
% Acquisizione da tastiera delle componenti del secondo vettore
 +
W = acquisisci_elementi(W, M);
 +
 +
% Ordinamento del primo vettore
 +
V = ordina(V, N);
 +
 +
% Ordinamento del secondo vettore
 +
W = ordina(W, M);
 +
 +
% Fusione dei due vettori
 +
U = fondi(V, W, N, M, U);
 +
 +
% Seconda stampa a video degli elementi del vettore fuso
 +
stampa_elementi(U, M+N);
 +
 +
</syntaxhighlight>

Versione attuale delle 13:55, 21 mar 2017

Vitoantonio Bevilacqua vitoantonio.bevilacqua@poliba.it

Antonio Brunetti antonio.brunetti@poliba.it

Gianpaolo Francesco Trotta gianpaolofrancesco.trotta@poliba.it

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

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.     for i = 1 : dim-1
  6.         i_min = i;
  7.         j = i+1;
  8.         for j = j : dim
  9.             if V(j) < V(i_min)
  10.                 % Se vero, aggiorno l'indice dell'elemento minimo
  11.                 i_min = j;
  12.              end
  13.          end
  14.  
  15.         % Blocco di codice relativo allo scambio
  16.         temp = V(i);
  17.         V(i) = V(i_min);
  18.         V(i_min) = temp;
  19.     end
  20. 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

Infine lo script completo in cui vengono richiamati le funzioni appena create.

  1. %% Codice per l'ordinamento in ordine crescente degli elementi di un vettore utilizzando l'algoritmo del selection sotrt
  2.  
  3. % Acquisisco da tastiera la dimensione del vettore
  4. % controllando che sia un numero compreso tra 5 e 10 (estremi inclusi)
  5. N = 0;
  6. flag = true;
  7. while flag == true
  8.    N = input('');
  9.  
  10.    flag = N < 5 || N > 10 ;
  11. end
  12.  
  13. % Creazione del vettore vuoto
  14. V = [];
  15.  
  16. % Acquisizione da tastiera delle componenti del vettore
  17. V = acquisisci_elementi(V, N);
  18.  
  19. % Prima stampa a video degli elementi del vettore
  20. stampa_elementi(V,N);
  21.  
  22. % Ordinamento del vettore
  23. V = ordina(V,N);
  24.  
  25. % Seconda stampa a video degli elementi del vettore
  26. stampa_elementi(V,N);

Fusione di due vettori ordinati

Riprendiamo l'esempio relativo al Merge 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 dei vettori, ordinamento, fusione 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.     for i = 1 : dim-1
  6.         i_min = i;
  7.         j = i+1;
  8.         for j = j : dim
  9.             if V(j) < V(i_min)
  10.                 % Se vero, aggiorno l'indice dell'elemento minimo
  11.                 i_min = j;
  12.              end
  13.          end
  14.  
  15.         % Blocco di codice relativo allo scambio
  16.         temp = V(i);
  17.         V(i) = V(i_min);
  18.         V(i_min) = temp;
  19.     end
  20. end

La terza funzione che dichiariamo e definiamo è quella di fusione. Con la stessa logica precedente, creiamo il file fondi.m

  1. function [ U ] = fondi( V, W, dimV, dimW, U )
  2. %fondi funzione che implementa l'algoritmo del merge sort
  3. %   La funzione accetta 5 parametri (i 2 vettore ordinati con le relative dimensioni, e il vettore che conterrà la fusione di V e W) e restituisce il vettore fuso
  4.  
  5. % Inizializzatione delle variabili utili all'algoritmo
  6. i = 1;
  7. j = 1;
  8. k = 1;
  9.  
  10. flag = true;
  11. while flag == true
  12.     if V(i) < W(j)
  13.         U(k) = V(i);
  14.         i = i+1;
  15.     else
  16.         U(k) = W(j);
  17.         j = j+1;
  18.     end
  19.     k = k+1;
  20.  
  21.     flag = i<= dimV && j <= dimW;
  22. end
  23.  
  24. if i < dimV
  25.     for i = i : 1 : dimV
  26.         U(k) = V(i);
  27.         k = k+1;
  28.     end
  29. else
  30.     for j = j : dimW
  31.         U(k) = W(j);
  32.         k = k+1;
  33.     end
  34.  
  35. 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

Infine lo script completo in cui vengono richiamati le funzioni appena create.

  1. %% Codice per il merge sort
  2.  
  3. % Acquisisco da tastiera la dimensione del primo vettore
  4. % controllando che sia un numero compreso tra 5 e 10 (estremi inclusi)
  5. N = 0;
  6. flag = true;
  7. while flag == true
  8.    N = input('');
  9.  
  10.    flag = N < 5 || N > 10 ;
  11. end
  12.  
  13. % Acquisisco da tastiera la dimensione del secondo vettore
  14. % controllando che sia un numero compreso tra 5 e 10 (estremi inclusi)
  15. M = 0;
  16. flag = true;
  17. while flag == true
  18.    M = input('');
  19.  
  20.    flag = M < 5 || M > 10 ;
  21. end
  22.  
  23. % Creazione dei vettore vuoti
  24. V = [];
  25. W = [];
  26. U = [];
  27.  
  28. % Acquisizione da tastiera delle componenti del primo vettore
  29. V = acquisisci_elementi(V, N);
  30.  
  31. % Acquisizione da tastiera delle componenti del secondo vettore
  32. W = acquisisci_elementi(W, M);
  33.  
  34. % Ordinamento del primo vettore
  35. V = ordina(V, N);
  36.  
  37. % Ordinamento del secondo vettore
  38. W = ordina(W, M);
  39.  
  40. % Fusione dei due vettori
  41. U = fondi(V, W, N, M, U);
  42.  
  43. % Seconda stampa a video degli elementi del vettore fuso
  44. stampa_elementi(U, M+N);