MATLAB - Funzioni

Una funzione è un gruppo di istruzioni che insieme eseguono un'attività. In MATLAB, le funzioni sono definite in file separati. Il nome del file e della funzione dovrebbero essere gli stessi.

Le funzioni operano su variabili all'interno del proprio spazio di lavoro, chiamato anche local workspace, separato dallo spazio di lavoro a cui accedi dal prompt dei comandi di MATLAB, chiamato base workspace.

Le funzioni possono accettare più di un argomento di input e possono restituire più di un argomento di output.

La sintassi di un'istruzione di funzione è:

function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)

Esempio

La seguente funzione denominata mymax dovrebbe essere scritta in un file denominato mymax.m . Richiede cinque numeri come argomento e restituisce il massimo dei numeri.

Crea un file funzione, chiamato mymax.m e digita il seguente codice in esso -

function max = mymax(n1, n2, n3, n4, n5)

%This function calculates the maximum of the
% five numbers given as input
max =  n1;
if(n2 > max)
   max = n2;
end
if(n3 > max)
   max = n3;
end
if(n4 > max)
   max = n4;
end
if(n5 > max)
   max = n5;
end

La prima riga di una funzione inizia con la parola chiave function. Fornisce il nome della funzione e l'ordine degli argomenti. Nel nostro esempio, la funzione mymax ha cinque argomenti di input e un argomento di output.

Le righe di commento che vengono subito dopo l'istruzione della funzione forniscono il testo della guida. Queste righe vengono stampate durante la digitazione:

help mymax

MATLAB eseguirà l'istruzione sopra e restituirà il seguente risultato:

This function calculates the maximum of the
   five numbers given as input

Puoi chiamare la funzione come -

mymax(34, 78, 89, 23, 11)

MATLAB eseguirà l'istruzione sopra e restituirà il seguente risultato:

ans = 89

Funzioni anonime

Una funzione anonima è come una funzione inline nei linguaggi di programmazione tradizionali, definita all'interno di una singola istruzione MATLAB. Consiste in una singola espressione MATLAB e un numero qualsiasi di argomenti di input e output.

Puoi definire una funzione anonima direttamente dalla riga di comando di MATLAB o all'interno di una funzione o uno script.

In questo modo puoi creare semplici funzioni senza dover creare un file per esse.

La sintassi per creare una funzione anonima da un'espressione è

f = @(arglist)expression

Esempio

In questo esempio, scriveremo una funzione anonima chiamata power, che prenderà due numeri come input e restituirà il primo numero elevato alla potenza del secondo numero.

Crea un file di script e digita il seguente codice al suo interno:

power = @(x, n) x.^n;
result1 = power(7, 3)
result2 = power(49, 0.5)
result3 = power(10, -10)
result4 = power (4.5, 1.5)

Quando esegui il file, viene visualizzato:

result1 =  343
result2 =  7
result3 =  1.0000e-10
result4 =  9.5459

Funzioni primarie e secondarie

Qualsiasi funzione diversa da una funzione anonima deve essere definita all'interno di un file. Ogni file di funzione contiene una funzione primaria richiesta che appare per prima e un numero qualsiasi di sotto-funzioni opzionali che viene dopo la funzione primaria e da essa utilizzate.

Le funzioni primarie possono essere chiamate dall'esterno del file che le definisce, dalla riga di comando o da altre funzioni, ma le sotto-funzioni non possono essere chiamate dalla riga di comando o da altre funzioni, dall'esterno del file di funzione.

Le sotto-funzioni sono visibili solo alla funzione primaria e ad altre sotto-funzioni all'interno del file di funzione che le definisce.

Esempio

Scriviamo una funzione chiamata quadratica che calcoli le radici di un'equazione quadratica. La funzione richiederebbe tre input, il coefficiente quadratico, il coefficiente lineare e il termine costante. Restituirebbe le radici.

Il file della funzione quadratic.m conterrà la funzione principale quadratica e la sottofunzione disco , che calcola il discriminante.

Crea un file funzione quadratic.m e digita il seguente codice in esso -

function [x1,x2] = quadratic(a,b,c)

%this function returns the roots of 
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficients of x2, x and the 
%constant term
% It returns the roots
d = disc(a,b,c); 
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end   % end of quadratic

function dis = disc(a,b,c) 
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end   % end of sub-function

Puoi chiamare la funzione sopra dal prompt dei comandi come -

quadratic(2,4,-4)

MATLAB eseguirà l'istruzione sopra e restituirà il seguente risultato:

ans = 0.7321

Funzioni annidate

È possibile definire funzioni all'interno del corpo di un'altra funzione. Queste sono chiamate funzioni annidate. Una funzione annidata contiene uno o tutti i componenti di qualsiasi altra funzione.

Le funzioni annidate sono definite nell'ambito di un'altra funzione e condividono l'accesso allo spazio di lavoro della funzione contenitore.

Una funzione nidificata segue la seguente sintassi:

function x = A(p1, p2)
...
B(p2)
   function y = B(p3)
   ...
   end
...
end

Esempio

Riscriviamo la funzione quadratic , dall'esempio precedente, tuttavia, questa volta la funzione disco sarà una funzione annidata.

Crea un file funzione quadratic2.m e digita il seguente codice al suo interno -

function [x1,x2] = quadratic2(a,b,c)
function disc  % nested function
d = sqrt(b^2 - 4*a*c);
end   % end of function disc

disc;
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end   % end of function quadratic2

Puoi chiamare la funzione sopra dal prompt dei comandi come -

quadratic2(2,4,-4)

MATLAB eseguirà l'istruzione sopra e restituirà il seguente risultato:

ans =  0.73205

Funzioni private

Una funzione privata è una funzione primaria visibile solo a un gruppo limitato di altre funzioni. Se non si desidera esporre l'implementazione di una o più funzioni, è possibile crearle come funzioni private.

Le funzioni private risiedono in subfolders con il nome speciale private.

Sono visibili solo alle funzioni nella cartella principale.

Esempio

Riscriviamo la funzione quadratica . Questa volta, tuttavia, la funzione del disco che calcola il discriminante, sarà una funzione privata.

Crea una sottocartella denominata private nella directory di lavoro. Memorizza il seguente file funzione disc.m in esso -

function dis = disc(a,b,c) 
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end      % end of sub-function

Crea una funzione quadratic3.m nella tua directory di lavoro e digita il seguente codice in essa -

function [x1,x2] = quadratic3(a,b,c)

%this function returns the roots of 
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficient of x2, x and the 
%constant term
% It returns the roots
d = disc(a,b,c); 

x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end      % end of quadratic3

Puoi chiamare la funzione sopra dal prompt dei comandi come -

quadratic3(2,4,-4)

MATLAB eseguirà l'istruzione sopra e restituirà il seguente risultato:

ans =  0.73205

Variabili globali

Le variabili globali possono essere condivise da più di una funzione. Per questo, è necessario dichiarare la variabile come globale in tutte le funzioni.

Se desideri accedere a quella variabile dallo spazio di lavoro di base, dichiara la variabile nella riga di comando.

La dichiarazione globale deve avvenire prima che la variabile venga effettivamente utilizzata in una funzione. È buona norma utilizzare lettere maiuscole per i nomi delle variabili globali per distinguerle dalle altre variabili.

Esempio

Creiamo un file di funzione chiamato average.m e digitiamo il seguente codice in esso -

function avg = average(nums)
global TOTAL
avg = sum(nums)/TOTAL;
end

Crea un file di script e digita il seguente codice al suo interno:

global TOTAL;
TOTAL = 10;
n = [34, 45, 25, 45, 33, 19, 40, 34, 38, 42];
av = average(n)

Quando esegui il file, verrà visualizzato il seguente risultato:

av =  35.500