Une fonction est un fichier texte portant l’extension *.m (M-files) et contenant une séquence d’instructions MATLAB.

Principes :

  • Permet d’étendre les fonctionnalités de MATLAB;
  • Arguments d’entrée et de sortie (plusieurs entrées et sorties possibles) définis dans un prototype;
  • Espace de travail local à la fonction.

 

Exemple de fonction

Nous allons écrire une fonction pour générer un tableau de n nombres aléatoires entiers compris entre 0 et une valeur maximale contenue dans une variable notée max.

Fichier rand_int.m

function res = rand_int (n, max)
% res : tableau de n entiers compris entre 0 et max
% "rand" : génère un nombre aléatoire entre 0 et 1
% "floor" : renvoie la partie entière d'un nombre

% génération des nombres aleatoires
temp = rand (1, n);
res = floor ((max + 1).*temp);

 

Détail d’une fonction

Prototype de la fonction

Définition des arguments de sortie, du nom de la fonction, des arguments d’entrée. Sans cette première ligne, le fichier M correspond plutôt à un fichier script.

function res = rand_int (n, max)

 

Description du programme

Description détaillée du programme, affichée avec les commandes lookfor et help sur le nom d’un m-file (premier paquet de commentaires sans ligne vide)

% res : tableau de n entiers compris entre 0 et max 
% "rand" : génère un nombre aléatoire entre 0 et 1 
% "floor" : renvoie la partie entière d'un nombre

 

Corps de la fonction

Code du programme (exécute des tâches et affecte des valeurs à toutes les sorties)

% génération des nombres aléatoires 
temp = rand (1, n); 
res = floor ((max + 1).*temp);

Commentaires

Texte apparaissant dans le corps de la fonction qui explique les lignes de code intermédiaires (commence toujours avec un pourcentage %).

 

Définition de la fonction

La première ligne déclare le nom de la fonction (rand_int), les arguments d’entrées (n, max) et les arguments de sortie (valeur retournées par la fonction, res). Sans cette première ligne, le fichier M correspond plutôt à un fichier script.

function res = rand_int (n, max)

 

Nom de la fonction

  • Commence par une lettre
  • Caractères alphanumériques ou underscores
  • Taille limitée (commande namelengthmax)

Le nom du fichier M-files doit correspondre au nom de la fonction : rand_int.m

 

Si la fonction possède plusieurs sorties, il faut les énumérer entre crochets, séparés par une virgule.

Si la fonction possède plusieurs entrées, il faut les énumérer dans les parenthèses qui suivent le nom de la fonction, séparés par une virgule

Exemples :
2 sorties, 2 entrées :

function [module, argument] = complexe (a, b)

pas de sortie:

function affiche_complexe(a, b)

 

 

Appel d’une fonction

L’appel d’une fonction se fait par son nom avec ses entrées et ses sorties.

Appel depuis :

  • l’interpréteur MATLAB.
  • une autre fonction
  • un script

Syntaxe :

resultat = nom_fichier (liste des arguments d’appel)

L’exemple suivant génère un vecteur aléatoire d’entiers, nommé « nb_alea », de longueur 10 et dont toutes les valeurs sont comprises entre 0 et 50.

>> nb_alea = rand_int (10,50)
nb_alea =
41   46     6   46   32     4   14   27   48   49

 

L’exécution d’une fonction s’achève :

  • lorsque la fin du script définissant la fonction à été atteint ;
  • lorsque une commande return ou un appel de la fonction error a été rencontrée ;
  • return termine immédiatement l’exécution de la fonction sans que la fin du script définissant celle-ci ait été atteint ;
  • error(’message’ ) procède de même, mais en plus, affiche le contenu de ’message’.

Le contrôle est alors renvoyé au point d’appel de la fonction, fenêtre de commande ou autre fonction.

 

Les sous-fonctions

Une sous-fonction est une fonction qui est créée et utilisée dans une même fonction primaire.

La fonction primaire est la fonction principale et porte le même nom que le fichier et est déclarée en premier dans le fichier.

Les sous-fonctions ne sont visibles que pour la fonction primaire, elles sont déclarées de la même manière que les fonctions primaires.

function [moy, med] = stat(u) % Fonction primaire

  % Calculer moyenne et médiane
  n = length(u);
  moy = moyenne(u,n);
  med = mediane(u,n);

  function m = moyenne(v,n) % Sous-fonction

    % Calculer la moyenne
    disp('fonction moyenne')
    m = sum(v)/n;
  end

  function m = mediane(v,n); % Sous-fonction

    % Calculer la médiane
    disp('fonction mediane')
    w = sort(v);
    if rem(n,2) == 1 % Cas impair
      m = w((n+1)/2);
    else % Cas pair
      m = (w(n/2)+w(n/2+1))/2;
    end
  end

end

stat() est la fonction primaire.

moyenne() et mediane() sont les sous-fonctions.

 

Portée d’une variable

Les variables dans les fonctions sont par défaut locales à la fonction.

function [A,B] = primary(x,y)
A = subfun1(x);
B = subfun2(y);

function v = subfun1(u)
  v = rand(u,1);

function v = subfun2(u)
  v = randn(u,1);

La variable u n’est accessible qu’à l’intérieur de la sous-fonction.

 

function T = tax(income)
  adj_income =...
  max(income - 6000, 0);
  T = compute_tax;

  function t = compute_tax
    t = 0.28*adj_income;

  end

end

la variable adj_income est accessible dans la sous-fonction.

 

Fonction privée

Une fonction privée est une fonction créée dans un sous-répertoire nommée private du répertoire contenant la fonction en cours d’exécution.

Seules les fonctions du répertoire parent peuvent accéder aux fonctions situées dans le sous-répertoire private.

Fonction privée

 

Ordre de recherche d’une fonction

Lorsque vous faite appel à une fonction, MATLAB cherche la fonction dans l’ordre suivant :

  1. Les sous-fonctions (s’il y en a);
  2. Les fonctions privées (sous-répertoire private du répertoire contenant la fonction en cours d’exécution);
  3. Les fonctions situées dans le répertoire courant (pas nécessairement celui de la fonction);
  4. Les fonctions situées dans les répertoires listés dans le path de MATLAB.

 

Nombre d’arguments variable

Un des aspects particulier de MATLAB, par rapport à d’autres langages de programmation, réside dans la possibilité d’utiliser et de concevoir des fonctions à nombre d’arguments variable.

Dans le corps d’une fonction, les deux commandes nargin et nargout retournent les nombres d’arguments en entrée et en sortie utilisés lors d’une utilisation de cette fonction.

En dehors du corps d’une fonction, nargin et nargout indiquent les nombres d’arguments en entrée et en sortie déclarés pour une fonction:

>> nargin('rand_int')

ans =
     2

>> nargout('rand_int')

ans =
     1

narg est négatif si la fonction fun est déclarée comme ayant un nombre d’arguments variable.

 

Exemple

function myplot(x, y, couleur, title, xlabel)

% MYPLOT Plot a function.
% MYPLOT(x, y, couleur, title, xlabel)
% The first two input arguments are
% required; the other three have default values.

if nargin < 5, couleur = ‘b’; end
if nargin < 4, title = ‘y=f(x)’; end
if nargin < 3, xlabel= ‘x’; end

plot(x, y,couleur,title,xlabel)

function [x0, y0] = myplot(x, y, couleur, title, xlabel)

% MYPLOT Plot a function.
% MYPLOT(x, y, couleur, title, xlabel)

...

if nargout == 0

  plot(x, y)

else

  x0 = x;
  y0 = y;

end

 

Prise en compte des variables de sorties

On peut inhiber le calcul d’une variable de sortie en la remplaçant par le symbole ~ :

[Kelvin, Fahrenheit]=conversion(Celsius)

Renvoie les variables Kelvin et Fahrenheit

[~, Fahrenheit]=conversion(Celsius)

Renvoie uniquement la variable Fahrenheit

 

Nombre d’arguments variable

Les instructions varargin et varargout sont utilisées, uniquement dans le corps d’une fonction, pour passer et retourner des arguments en nombres variables:

function y=fun(x,varargin)

function [y,varargout]=fun(x)

Dans la déclaration, chaque instruction doit être écrite en minuscules et doit être la dernière variable de la liste des arguments.

Exemple :

function myplot(x,varargin)

plot(x,varargin{:})

Application :

myplot(sin(0:.1:1),'color',[.5 .7 .3],'linestyle',':')