Main Content

La traduzione di questa pagina non è aggiornata. Fai clic qui per vedere l'ultima versione in inglese.

Script e funzioni

Panoramica

MATLAB® offre un potente linguaggio di programmazione, oltre che un ambiente di calcolo interattivo. Questo linguaggio consente di inserire un comando per volta dalla Riga di comando di MATLAB oppure scrivere una serie di comandi su un file da eseguire successivamente come una normale funzione di MATLAB. Utilizzare l'Editor di MATLAB o qualsiasi altro editor di testo per creare dei file di funzioni personalizzate. Queste funzioni vengono richiamate come qualsiasi altra funzione o comando di MATLAB.

Vi sono due tipi di file di programma:

  • Gli script, che non accettano argomenti di input e non restituiscono argomenti di output. Operano sui dati del workspace.

  • Le funzioni, che accettano argomenti di input e restituiscono argomenti di output. Le variabili interne sono locali alla funzione.

I programmatori di MATLAB meno esperti possono creare i file di programma di prova nella cartella corrente. A mano a mano che si sviluppano più file personalizzati è consigliabile organizzarli in altre cartelle e toolbox personalizzate che è possibile aggiungere al proprio percorso di ricerca di MATLAB.

In caso di nomi di funzioni doppi, MATLAB esegue la prima funzione trovata nel percorso di ricerca.

Per visualizzare il contenuto di un file di programma, ad esempio myfunction.m, utilizzare

type myfunction

Script

Quando si richiama uno script, MATLAB esegue semplicemente i comandi trovati nel file. Gli script possono operare sui dati esistenti del workspace, oppure possono creare nuovi dati su cui operare. Gli script non restituiscono argomenti di output, ma eventuali variabili create restano nel workspace per l'utilizzo in calcoli successivi. Gli script, inoltre, possono generare output grafico utilizzando funzioni come plot.

Ad esempio, creare un file denominato magicrank.m contenente i seguenti comandi MATLAB:

% Investigate the rank of magic squares
r = zeros(1,32);
for n = 3:32
   r(n) = rank(magic(n));
end
bar(r)

Digitando la dichiarazione

magicrank

MATLAB esegue i comandi, calcola il rank dei primi 30 quadrati magici e traccia un grafico a barre dei risultati. Dopo il completamento dell'esecuzione del file, le variabili n e r rimangono nel workspace.

Funzioni

Le funzioni sono file che accettano argomenti di input e restituiscono argomenti di output. I nomi del file e della funzione dovrebbero coincidere. Le funzioni operano su variabili nell'ambito del proprio workspace, distinto dal workspace a cui si accede dal prompt dei comandi di MATLAB.

rank rappresenta un buon esempio. Il file rank.m è disponibile nella cartella

toolbox/matlab/matfun

Il file può essere visualizzato con

type rank

Questo è il file:

function r = rank(A,tol)
%   RANK Matrix rank.
%   RANK(A) provides an estimate of the number of linearly
%   independent rows or columns of a matrix A.
%   RANK(A,tol) is the number of singular values of A
%   that are larger than tol.
%   RANK(A) uses the default tol = max(size(A)) * norm(A) * eps.

s = svd(A);
if nargin==1
   tol = max(size(A)') * max(s) * eps;
end
r = sum(s > tol);

La prima riga di una funzione inizia con la parola chiave function. La parola chiave riporta il nome della funzione e l'ordine degli argomenti. In questo caso vi sono fino a due argomenti di input e un argomento di output.

Le numerose righe successive, fino al primo spazio vuoto o alla riga eseguibile, sono righe di commento con testo di aiuto. Queste righe vengono stampate digitando

help rank

La prima riga del testo di aiuto è la riga H1, visualizzata da MATLAB quando si utilizza il comando lookfor o la richiesta help su una cartella.

La parte restante del file è il codice eseguibile di MATLAB che definisce la funzione. La variabile s inserita nel corpo della funzione, come le variabili nella prima riga, r, A e tol, sono tutte locali alla funzione e sono distinte rispetto ad altre variabili nel workspace di MATLAB.

Questo esempio illustra un aspetto delle funzioni di MATLAB che solitamente non sono disponibili in altri linguaggi di programmazione: un numero variabile di argomenti. La funzione rank può essere utilizzata in numerosi modi diversi:

rank(A)
r = rank(A)
r = rank(A,1.e-6)

Molte funzioni sono utilizzabili allo stesso modo. Se non viene fornito alcun argomento di output, il risultato viene memorizzato in ans. Se non viene fornito il secondo argomento di input, la funzione calcola un valore di default. Nel corpo della funzione sono disponibili due quantità denominate nargin e nargout, che riportano il numero di argomenti di input e di output coinvolti in ciascun particolare utilizzo della funzione. La funzione rank utilizza nargin, ma non necessita dell'utilizzo di nargout.

Tipi di funzioni

MATLAB offre diversi tipi di funzioni da utilizzare in fase di programmazione.

Funzioni anonime

Una funzione anonima è una forma semplice della funzione di MATLAB definita nell'ambito di una singola dichiarazione di MATLAB. È formata da una singola espressione di MATLAB e da un numero qualsiasi di argomenti di input e di output. È possibile definire una funzione anonima direttamente dalla Riga di comando di MATLAB oppure internamente a una funzione o a uno script. Si tratta di un metodo rapido per creare funzioni semplici, senza dover creare ogni volta un corrispettivo file.

La sintassi per la creazione di una funzione anonima da un'espressione è

f = @(arglist)expression

La dichiarazione seguente crea una funzione anonima che calcola il quadrato di un numero. Quando si richiama questa funzione, MATLAB assegna il valore passato alla variabile x, poi utilizza x nell'equazione x.^2:

sqr = @(x) x.^2;

Per eseguire la funzione sqr digitare

a = sqr(5)
a =
   25

Funzioni principali e funzioni locali

Qualsiasi funzione non anonima deve essere definita in un file. Ciascuno di questi file delle funzioni contiene una funzione principale obbligatoria riportata all'inizio, e un numero qualsiasi di funzioni locali che possono seguire la funzione principale. Le funzioni principali presentano una portata più ampia rispetto alle funzioni locali. Questo significa che le funzioni principali possono essere richiamate esternamente rispetto al file che le definisce, ad esempio dalla Riga di comando di MATLAB oppure da funzioni in altri file, mentre questo non è possibile per le funzioni locali. Le funzioni locali sono visibili solo dalla funzione principale e dalle altre funzioni locali nello stesso file a cui appartengono.

La funzione rank riportata nella sezione sulle Funzioni costituisce un esempio di funzione principale.

Funzioni private

Una funzione privata è un tipo di funzione principale. La sua caratteristica unica è di essere visibile solo a un gruppo limitato di altre funzioni. Può essere utile se si desidera limitare l'accesso a una funzione, oppure quando si sceglie di non esporre l'implementazione di una funzione.

Le funzioni private risiedono in cartelle secondarie caratterizzate dal nome speciale private. Sono visibili solo dalle funzioni nella cartella superiore. Ad esempio, si consideri una cartella newmath nel percorso di ricerca di MATLAB. Una cartella secondaria di newmath denominata private può contenere funzioni richiamabili solo dalle funzioni in newmath.

Poiché le funzioni private risultano invisibili al di fuori della cartella superiore, possono utilizzare gli stessi nomi delle funzioni in altre cartelle. Si tratta di una caratteristica utile se si desidera creare versioni personalizzate di una particolare funzione, conservando al contempo l'originale in un'altra cartella. Poiché MATLAB ricerca prima le funzioni private e successivamente quelle standard, troverà una funzione privata denominata test.m prima di un file non privato denominato test.m.

Funzioni annidate

È possibile definire una funzione nel corpo di un'altra funzione. In questo caso viene definita come annidata nella funzione esterna. Una funzione annidata contiene alcuni o tutti i componenti di qualsiasi altra funzione. In questo esempio la funzione B è annidata nella funzioneA:

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

Come altre funzioni, una funzione annidata dispone di un proprio workspace in cui vengono memorizzate le variabili utilizzate dalla funzione stessa. Dispone comunque anche dell'accesso ai workspace di tutte le funzioni in cui è annidata. Ad esempio, quindi, una variabile con un valore assegnatole dalla funzione principale può essere letta o sovrascritta da una funzione annidata a qualsiasi livello nella funzione principale. Allo stesso modo, una variabile assegnata in una funzione annidata può essere letta o sovrascritta da una qualsiasi delle funzioni che la contengono.

Variabili globali

Se si desidera che più funzioni condividano un'unica copia di una variabile, dichiarare semplicemente la variabile come global in tutte le funzioni. Seguire la stessa procedura dalla Riga di comando per consentire al workspace di base di accedere alla variabile. La dichiarazione 'global' va effettuata prima dell'effettivo utilizzo della variabile in una funzione. Benché non sia obbligatorio, l'uso delle maiuscole per i nomi delle variabili globali aiuta a distinguerle da altre variabili. Ad esempio, creare una nuova funzione in file denominato falling.m:

function h = falling(t)
global GRAVITY
h = 1/2*GRAVITY*t.^2;

Digitare quindi le dichiarazioni in modo interattivo

global GRAVITY
GRAVITY = 32;
y = falling((0:.1:5)');

Le due dichiarazioni globali rendono disponibile all'interno della funzione il valore assegnato a GRAVITY dal prompt di comando. È quindi possibile modificare GRAVITY in modo interattivo e ottenere nuove soluzioni senza modificare alcun file.

Sintassi dei comandi e sintassi delle funzioni

È possibile scrivere funzioni di MATLAB che accettano argomenti contenenti caratteri senza utilizzare parentesi né virgolette. MATLAB interpreta cioè

foo a b c

come

foo('a','b','c')

Quando si utilizza la forma dei comandi senza virgolette, tuttavia, MATLAB non è in grado di restituire argomenti di output. Ad esempio,

legend apples oranges

crea una legenda su un grafico utilizzando apples e oranges come etichette. Se si desidera far restituire al comando legend i suoi argomenti di output, è necessario utilizzare la forma con virgolette:

[legh,objh] = legend('apples','oranges');

È inoltre possibile utilizzare la forma con virgolette se uno qualsiasi degli argomenti non è un vettore di caratteri.

Attenzione

La forma della sintassi dei comandi senza virgolette può essere comoda, ma in alcuni casi potrebbe essere utilizzata in modo scorretto senza che MATLAB generi alcun errore.

Generazione di argomenti con caratteri nel codice

La forma con virgolette delle funzioni permette di generare argomenti con caratteri all'interno del codice. L'esempio seguente elabora più file di dati, August1.dat, August2.dat, e così via. Utilizza la funzione int2str, che converte un numero intero in carattere, per generare il nome file:

for d = 1:31
   s = ['August' int2str(d) '.dat'];
   load(s) 
   % Code to process the contents of the d-th file
end