Contenu principal

Fonctions anonymes

Qu’est-ce qu’une fonction anonyme ?

Une fonction anonyme est une fonction qui n’est pas stockée dans un fichier de programme mais est associée à une variable dont le type de données est function_handle. Les fonctions anonymes peuvent accepter plusieurs entrées et renvoient une seule sortie. Elles peuvent contenir une seule instruction exécutable.

Remarque

Vous pouvez créer une fonction anonyme renvoyant plusieurs sorties avec la fonction deal. Pour obtenir un exemple, consultez Return Multiple Outputs from Anonymous Function.

Par exemple, créez un handle vers une fonction anonyme qui calcule le carré d’un nombre :

sqr = @(x) x.^2;

La variable sqr est un handle de fonction. L’opérateur @ crée le handle. Les parenthèses () placées juste après l’opérateur @ contiennent les arguments en entrée de la fonction. Cette fonction anonyme accepte une seule entrée x et renvoie implicitement une seule sortie, à savoir un tableau de même taille que x contenant les valeurs au carré.

Calculez le carré d’une valeur particulière (5) en passant celle-ci au handle de fonction exactement comme si vous passiez un argument en entrée à une fonction standard.

a = sqr(5)
a =
   25

De nombreuses fonctions MATLAB® acceptent des handles de fonction en entrée, ce qui permet d’évaluer les fonctions sur une plage de valeurs. Il est possible de créer des handles vers des fonctions anonymes ou vers des fonctions contenues dans des fichiers de programme. L’avantage des fonctions anonymes est que vous n’avez pas à modifier ni gérer un fichier pour une fonction nécessitant seulement une brève définition.

Par exemple, calculez l’intégrale de la fonction sqr de 0 à 1 en passant le handle de fonction à la fonction integral :

q = integral(sqr,0,1);

Vous n’avez pas besoin de créer une variable dans l’espace de travail pour stocker une fonction anonyme. Au lieu de cela, vous pouvez créer un handle de fonction temporaire dans une expression, par exemple cet appel à la fonction integral :

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

Variables dans l’expression

Les handles de fonction peuvent contenir une expression mais aussi les variables dont celle-ci a besoin pour l’évaluation.

Par exemple, créez un handle vers une fonction anonyme nécessitant les coefficients a, b et c.

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

Comme a, b et c sont disponibles au moment où vous créez parabola, le handle de fonction inclut ces valeurs. Les valeurs sont conservées dans le handle de fonction même si vous effacez les variables :

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

Pour indiquer des valeurs différentes pour les coefficients, vous devez créer un nouveau handle de fonction :

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

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

Vous pouvez enregistrer les handles de fonction et les valeurs associées dans un fichier MAT et les charger dans une session MATLAB ultérieure avec les fonctions save et load, par exemple :

save myfile.mat parabola

Utilisez uniquement des variables explicites lorsque vous créez des fonctions anonymes. Si une fonction anonyme accède à une variable ou une fonction imbriquée qui n’est pas explicitement référencée dans la liste d’arguments ou le corps de la fonction, MATLAB génère une erreur au moment d’invoquer la fonction. On rencontre souvent des variables et appels de fonction implicites dans les fonctions comme eval, evalin, assignin et load. Évitez d’utiliser ces fonctions dans le corps de fonctions anonymes.

Fonctions anonymes multiples

L’expression d’une fonction anonyme peut contenir une autre fonction anonyme. Cela est utile pour passer différents paramètres à une fonction évaluée sur une plage de valeurs. Par exemple, vous pouvez résoudre l’équation

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.

pour différentes valeurs de c en combinant deux fonctions anonymes :

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

Voici comment arriver à cette instruction :

  1. Écrivez l’intégrande sous forme de fonction anonyme,

    @(x) (x.^2 + c*x + 1)
  2. Évaluez la fonction de zéro à un en passant le handle de fonction à integral,

    integral(@(x) (x.^2 + c*x + 1),0,1)
  3. Indiquez la valeur de c en créant une fonction anonyme pour l’ensemble de l’équation,

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

La fonction finale permet de résoudre l’équation pour toute valeur de c. Par exemple :

g(2)
ans =
   2.3333

Fonctions sans entrée

Si votre fonction ne nécessite aucune entrée, utilisez des parenthèses vides lorsque vous définissez et appelez la fonction anonyme. Par exemple :

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

L’omission des parenthèses dans l’instruction d’affectation crée un autre handle de fonction et n’exécute pas la fonction :

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

Fonctions avec plusieurs entrées ou sorties

Les fonctions anonymes nécessitent de spécifier explicitement les arguments en entrée comme pour une fonction standard, en séparant les entrées multiples par des virgules. Par exemple, la fonction suivante accepte deux entrées x et y :

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

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

En revanche, une fonction anonyme renvoie une seule sortie. Si l’expression de la fonction renvoie plusieurs sorties, vous pouvez les demander lorsque vous invoquez le handle de fonction.

Par exemple, la fonction ndgrid peut renvoyer un nombre de sorties égal au nombre de vecteurs en entrée. La fonction anonyme suivante qui appelle ndgrid renvoie une seule sortie (mygrid). Invoquez mygrid pour accéder aux sorties renvoyées par la fonction ndgrid.

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

Vous pouvez utiliser la sortie de mygrid pour créer un tracé maillé ou un graphique de surface :

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

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

Tableaux de fonctions anonymes

Même si la plupart des types de données fondamentaux de MATLAB supportent les tableaux multidimensionnels, les handles de fonction doivent être des scalaires (des éléments uniques). Toutefois, vous pouvez stocker plusieurs handles de fonction avec un cell array ou un tableau de structures. L’approche la plus courante consiste à utiliser un cell array, par exemple :

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

Lorsque vous créez un cell array, n’oubliez pas que MATLAB interprète les espaces comme des séparateurs de colonnes. Omettez les espaces dans les expressions (comme dans le code précédent) ou bien placez les expressions entre parenthèses, par exemple :

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

Accédez au contenu d’une cellule avec des accolades. Par exemple, f{1} renvoie le premier handle de fonction. Pour exécuter la fonction, passez les valeurs en entrée entre parenthèses après les accolades :

x = 1;
y = 10;

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

ans =
    20

ans =
    21

Voir aussi

Rubriques