Contenuto principale

Funzioni anonime

Cosa sono le funzioni anonime?

Una funzione anonima è una funzione che non è memorizzata in un file di programma, ma è associata a una variabile il cui tipo di dati è function_handle. Le funzioni anonime possono accettare più input e restituire un output. Possono contenere solo una singola dichiarazione eseguibile.

Nota

È possibile creare una funzione anonima che restituisca più output utilizzando la funzione deal. Per un esempio, vedere Return Multiple Outputs from Anonymous Function.

Ad esempio, creare un handle per una funzione anonima che trovi il quadrato di un numero:

sqr = @(x) x.^2;

La variabile sqr è un handle della funzione. L'operatore @ mentre le parentesi () poste immediatamente dopo l'operatore @ includono gli argomenti di input della funzione. Questa funzione anonima accetta un singolo input x e restituisce implicitamente un singolo output, ossia un array delle stesse dimensioni di x che contiene i valori al quadrato.

Trovare il quadrato di un determinato valore (5) passando il valore all'handle della funzione, esattamente come si passerebbe un argomento di input a una funzione standard.

a = sqr(5)
a =
   25

Molte funzioni di MATLAB® accettano handle delle funzioni come input, consentendo di valutare le funzioni su un intervallo di valori. È possibile creare handle sia per le funzioni anonime sia per le funzioni presenti nei file di programma. Il vantaggio di utilizzare le funzioni anonime è che non è necessario modificare e mantenere un file per una funzione che richiede solo una definizione breve.

Ad esempio, trovare l'integrale della funzione sqr da 0 a 1 passando l'handle della funzione alla funzione integral:

q = integral(sqr,0,1);

Non è necessario creare una variabile nel workspace per memorizzare una funzione anonima. È invece possibile creare un handle temporaneo della funzione all'interno di un'espressione, come in questa chiamata alla funzione integral:

q = integral(@(x) x.^2,0,1);

Variabili nell'espressione

Gli handle della funzione possono memorizzare non solo un'espressione, ma anche le variabili necessarie per valutarla.

Ad esempio, creare un handle per una funzione anonima che richiede i coefficienti a, b e c.

a = 1.3;
b = .2;
c = 30;
parabola = @(x) a*x.^2 + b*x + c;

Poiché a, b e c sono disponibili al momento della creazione di parabola, l'handle della funzione include tali valori. I valori persistono all'interno dell'handle della funzione anche se si eliminano le variabili:

clear a b c
x = 1;
y = parabola(x)
y =
   31.5000

Per fornire valori diversi per i coefficienti, è necessario creare un nuovo handle della funzione:

a = -3.9;
b = 52;
c = 0;
parabola = @(x) a*x.^2 + b*x + c;

x = 1;
y = parabola(x)
y =
   48.1000

È possibile salvare gli handle delle funzioni e i valori associati in un file MAT e caricarli in una sessione successiva di MATLAB utilizzando le funzioni save e load; ad esempio

save myfile.mat parabola

Utilizzare solo variabili esplicite quando si costruiscono funzioni anonime. Se una funzione anonima accede a qualsiasi variabile o funzione annidata che non è esplicitamente referenziata nell'elenco degli argomenti o nel corpo, MATLAB genera un errore quando si richiama la funzione. Le variabili implicite e le chiamate di funzione si incontrano spesso nelle funzioni quali eval, evalin, assignin e load. Evitare di utilizzare queste funzioni nel corpo delle funzioni anonime.

Funzioni anonime multiple

L'espressione in una funzione anonima può includere un'altra funzione anonima. Questa opzione è utile per passare parametri diversi a una funzione che si sta valutando su un intervallo di valori. Ad esempio, è possibile risolvere l'equazione

An equation for the function g of c which is equal to the integral from 0 to 1 of x squared plus c times x plus 1 times d x.

per i valori variabili di c combinando due funzioni anonime:

g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));

Ecco come derivare questa dichiarazione:

  1. Scrivi l'integrando come una funzione anonima,

    @(x) (x.^2 + c*x + 1)
  2. Valutare la funzione da zero a uno passando l'handle della funzione a integral,

    integral(@(x) (x.^2 + c*x + 1),0,1)
  3. Fornire il valore di c costruendo una funzione anonima per l'intera equazione,

    g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));

La funzione finale consente di risolvere l'equazione per qualsiasi valore di c. Ad esempio:

g(2)
ans =
   2.3333

Funzioni senza input

Se la funzione non richiede alcun input, utilizzare le parentesi vuote quando si definisce e si chiama la funzione anonima. Ad esempio:

t = @() datestr(now);
d = t()
d =
26-Jan-2012 15:11:47

L'omissione delle parentesi nella dichiarazione di assegnazione crea un altro handle della funzione e non esegue la funzione:

d = t
d = 
    @() datestr(now)

Funzioni con più input o più output

Le funzioni anonime richiedono che gli argomenti di input siano specificati esplicitamente come per una funzione standard, separando più input con virgole. Ad esempio, questa funzione accetta due input x e y:

myfunction = @(x,y) (x^2 + y^2 + x*y);

x = 1;
y = 10;
z = myfunction(x,y)
z = 
111

Tuttavia, una funzione anonima restituisce un solo output. Se l'espressione nella funzione restituisce più output, è possibile richiederli quando si invoca l'handle della funzione.

Ad esempio, la funzione ndgrid può restituire un numero di output pari al numero di vettori di input. Questa funzione anonima che chiama ndgrid restituisce un solo output (mygrid). Invocare mygrid per accedere agli output restituiti dalla funzione ndgrid.

c = 10;
mygrid = @(x,y) ndgrid((-x:x/c:x),(-y:y/c:y));
[x,y] = mygrid(pi,2*pi);

È possibile utilizzare l'output di mygrid per creare un grafico a griglia o a superficie:

z = sin(x) + cos(y);
mesh(x,y,z)

Figure contains an axes object. The axes object contains an object of type surface.

Array di funzioni anonime

Sebbene la maggior parte dei tipi di dati fondamentali di MATLAB supporti gli array multidimensionali, gli handle delle funzioni devono essere scalari (elementi singoli). Tuttavia, è possibile memorizzare più handle delle funzioni utilizzando un array di celle o un array di strutture. L'approccio più comune consiste nell'utilizzare un array di celle; ad esempio

f = {@(x)x.^2;
     @(y)y+10;
     @(x,y)x.^2+y+10};

Quando si crea l'array di celle, tenere presente che MATLAB interpreta gli spazi come separatori di colonne. Omettere quindi gli spazi nelle espressioni, come mostrato nel codice precedente, oppure racchiudere le espressioni tra parentesi; ad esempio

f = {@(x) (x.^2);
     @(y) (y + 10);
     @(x,y) (x.^2 + y + 10)};

Accedere al contenuto di una cella utilizzando le parentesi graffe. Ad esempio, f{1} restituisce il primo handle della funzione. Per eseguire la funzione, passare i valori di input tra parentesi dopo le parentesi graffe:

x = 1;
y = 10;

f{1}(x)
f{2}(y)
f{3}(x,y)
ans =
     1

ans =
    20

ans =
    21

Vedi anche

Argomenti