Vous êtes sur la page 1sur 11

UTILISATION DES PROCÉDURES ET FONCTIONS EN MATLAB

1. Introduction :
On distingue 2 types de M-file, les fichiers de scripts et les fichiers de fonctions. Un script est un ensemble
d'instructions MATLAB qui joue le rôle de programme principal.
Les scripts sont des collections de commandes et d’instructions mises les unes à la suite des autres. Ils
n’acceptent aucun argument en entrée et ne retourne aucun argument. Ils agissent sur les variables de l’espace
de travail global (accessible depuis le prompt >> de la fenêtre de commande): ils peuvent modifier, effacer,
créer des variables.

Les fonctions sont aussi des collections de commandes et d’instructions mises les unes à la suite des autres,
mais elles acceptent des arguments en entrée et en sortie. Les fonctions agissent sur les variables de leur
propre espace de travail, séparé de l’espace de travail global accessible depuis le prompt >> de la fenêtre de
commande. Ceci veut dire, que les arguments sont passés par valeur, et non pas par adresse!
Le nom de la fonction et du fichier qui la contient doivent être identiques (sans l’extension .m).

Les fichiers de fonctions ont deux rôles. Ils permettent à l'utilisateur de définir des fonctions qui ne figurent pas
parmi les fonctions incorporées de MATLAB (<< built-in functions >>) et de les utiliser de la même manière
que ces dernières (ces fonctions sont nommées fonctions utilisateur).
Ces fichiers sont également un élément important dans la programmation d'applications où les fonctions jouent
le rôle des fonctions et procédures des langages de programmation usuels.

2. Fonctions :
Pour définir une fonction sous Matlab, on écrit la définition de la fonction dans un fichier avec une extension .m
(fonction M-File). Le nom du fichier doit être le nom de la première fonction définie. On l'exécute en tapant le
nom de la fonction avec entre parenthèses la liste des arguments. La première ligne du fichier de la fonction doit
suivre la syntaxe suivante:
function[arguments de sortie] = nom(arguments d'entrée)
C’est cette première ligne qui fait office de «déclaration» ou de «prototype» de la fonction.
Le fichier doit impérativement commencer par le mot-clé function.
On doit donc déclarer les valeurs calculées par la fonction dans les variables de sortie (arguments), et les
paramètres de la fonction dans les variables d'entrée (arguments) (qui ne sont pas modifiés).
Si la fonction ne possède qu'une seule variable de sortie, les crochets sont inutiles.
1
Prof. LAMRI B.
On définit la fonction Matlab fonc de la manière suivante (avec n arguments d’entrée et m arguments de sortie) :
function [y1, ..., ym] = fonc(x1, ..., xn)
séquence d'instructions % (corps de la fonction)
Il est impératif que la fonction ayant pour nom fonc soit enregistrée dans un fichier de nom fonc.m sans quoi
cette fonction ne sera pas << visible >> par MATLAB.
Remarque : Contrairement au script, les variables d'une fonction sont des variables locales, qui ne sont pas
accessibles en dehors de la fonction. Pour passer des information à une fonction, il faut donc utiliser les
paramètres d'entrée ou de sortie. En fait on peut utiliser des variables globales (mot clé global) sous Matlab.

D’une manière générale, il est bon de ranger les variables de sortie par ordre <<d'importance>>. Il est
également possible d'appeler une fonction donnée avec moins de variables d'entrée que le nombre indiqué pour
la définition de la fonction (il faut bien entendu que le corps de la fonction soit programmé de sorte de prévoir
cette éventualité).
Il existe deux fonctions MATLAB utiles pour gérer cette situation: nargin qui retourne le nombre de variables
d'entrée utilisés lors de l'appel et nargout qui retourne le nombre de variables de sortie prévues lors de l'appel.

Remarques:
a) Il n'y a pas de mot-clé (par exemple end) pour indiquer la fin de la fonction. La fonction est supposée se
terminer à la fin du fichier. Il est toutefois possible de provoquer un retour au programme appelant dans
le corps de la fonction grâce à la commande return.
b) Dans les anciennes versions de Matlab, on ne pouvait écrire qu'une seule fonction par fichier (qui doit
porter le nom de cette fonction). Toutefois dans les nouvelles versions existe la notion de << sous-
fonctions >> qui peuvent être écrites dans le même fichier que la première fonction.
c) Si le fichier ne commence pas par le mot-clé function on a tout simplement écrit un script

3. Types de fonctions :
MATLAB reconnait plusieurs types de fonctions:
 les sous-fonctions;
 les fonctions imbriquées;
 les fonctions privées;
 les fonctions en ligne;
 les pointeurs de fonctions;
 les fonctions anonymes.
2
Prof. LAMRI B.
3.1 Les sous-fonctions :
Une sous-fonction est une fonction écrite dans le même fichier qu'une autre fonction (dite principale) et qui ne
sera utilisable que par cette fonction principale (une sous-fonction ne peut pas être appelée par un autre sous-
programme que la fonction principale). Un fichier fonc.m peut contenir la définition d’autres fonctions que la
fonction principale fonc.

function y=fonc(x)
end
function y1=fonc1(x1)
end

function y2=fonc(x2)
end
function y3=fonc(x3)
end

Elles peuvent être définies après le corps (function – end) de la fonction principale, ce sont alors des sous-
fonctions.
Une sous-fonction est visible: * depuis la fonction principale
* depuis une autre sous-fonction

Du point de vue, portée des variables, chaque fonction a son propre espace de travail, donc: elles n’ont pas
accès aux mêmes variables (sauf si global).

3.2 Les fonctions imbriquées :


Un fichier fonc.m peut contenir la définition d’autres fonctions que la fonction principale fonc.
Elles peuvent être définies dans le corps [function – end (obligatoire)] de la fonction principale, ce sont alors
des fonctions imbriquées.

Une fonction imbriquée est visible:


 depuis sa fonction mère (niveau supérieur);
 depuis une fonction sœur (imbriquée au même niveau);
 depuis une fonction fille (imbriquée dans elle-même).

3
Prof. LAMRI B.
function y=fonc(x)

function y1=fonc1(x1)
end
function y2=fonc(x2)

function y3=fonc(x3)

end

end

end

Du point de vue, portée des variables, chaque fonction a son propre espace de travail. Donc les fonctions n’ont
pas accès aux mêmes variables (sauf si global). Mais elles ont accès aux variables de leurs ancêtres.

Comme MATLAB recherche toujours une sous-fonction avant de rechercher une fonction principale, les sous-
fonctions peuvent porter le nom de fonctions principales se trouvant dans d’autres répertoires mais ce nom doit
être unique au sein d’un même fichier.
L’aide pour une sous-fonction est affiché à l’aide de la commande help en spécifiant le nom de la fonction
principale suivi d’un > puis du nom de la sous-fonction.

3.3 Les fonctions privées :


Les fonctions privées sont des fonctions qui résident dans des sous-répertoires avec le nom private.
Les fonctions privées ne sont visibles que des fonctions du répertoire parent.
Comme MATLAB recherche toujours une fonction privée avant de rechercher une fonction principale, les
fonctions privées peuvent porter le nom de fonctions principales se trouvant dans d’autres répertoires mais ce
nom doit être unique au sein d’un même répertoire.
C’est un moyen pratique et simple pour créer une version spéciale d’une fonction tout en conservant
l’originale dans un autre répertoire.

3.4 Les fonctions en ligne :


La fonction inline permet de définir directement une fonction sans avoir à créer un fichier portant le nom de
cette fonction:
4
Prof. LAMRI B.
h = inline('expression');
h = inline('expression','args');
N.B.:
 L’expression de la fonction doit être assez simple et le nombre d’arguments pas trop élevé.
 Il n’est pas possible d’utiliser une variable locale, ni globale, dans l’expression de la fonction.

Ex. f = inline('cos(pi*x)/(2*x)','x')
f(3)
f= ans =
-0.1667
Inline function:
f(x) = cos(pi*x)/(2*x)

3.5 Les pointeurs de fonctions :


Le caractère @ est un opérateur utilisé pour créer un pointeur (handle) vers une fonction contenu dans un
fichier: h = @fonc;
ou à partir d’une expression: h = @(args) expression;

N.B.:
 L’expression de la fonction doit être assez simple et le nombre d’arguments pas trop élevé.
 Il est possible d’utiliser des variables (locales ou globales) dans l’expression de la fonction.

Ex. :
f = @(t,g) 0.5*g*t.^2
f=
@(t,g) 0.5*g*t.^2

t=0:0.01:10;
figure(1);
plot(t,f(t,9.8),'b-')
xlabel('Temps (secondes)')
ylabel('Distance (mètre)')
title('Distance vs.Temps')

Il est possible de passer une fonction en argument à une autre fonction de plusieurs manières:
 à l’aide d’une chaine de caractères;
 à l’aide d’une fonction en ligne;
 à l’aide d’un pointeur de fonction.

5
Prof. LAMRI B.
3.6 Les fonctions anonymes:
Une fonction anonyme est une fonction MATLAB qui est définie directement, sans la création préalable d'un
fichier spécifique. La fonction est dite anonyme, parce qu'elle n'a pas de nom explicite.
Le symbole @ permet la matérialisation de cette création de fonction anonyme.
le symbole @, est un handle, c'est-à-dire un pointeur vers une fonction.
La syntaxe générale pour définir une fonction anonyme est :
Variable_stockant_la_fonction = @(argument1,argument2,....) expression_de_la_fonction
Généralement, on utilise les fonctions anonymes pour créer des raccourcis syntaxiques.
Les arguments de la fonction, s'ils existent, sont déclarés entre parenthèses juste après le handle @. La variable
dans laquelle est stockée la définition de la fonction anonyme fait office de nom, car c'est grâce à cette variable
que l'on pourra appeler la fonction anonyme, en précisant les arguments nécessaires :
sortie = Variable_stockant_la_fonction(valeur1,valeur2,...);
Ex1. puissance = @(x,n) x.^n; %fonction anonyme qui calcule la puissance d'une valeur ou d'un tableau.
On peut l’utiliser directement pour calculer (4)2 :
puissance(4,2) et ça donne 16.
Ex2. carre = @(x) x.^2; carre(2) donne 16
carre(1:9) donne 1 4 9 16 25 36 49 64 81

4. Les variables de fonctions :


Nom d’une variable:
Depuis une fonction, la fonction inputname(argno) retourne le nom de la variable d’appel correspondant à
l’argument numéro argno.
S’il n’y a pas de variable d’appel pour cet argument (par exemple parce que l’appel correspond à un nombre ou
au résultat d’une opération), alors inputname retourne la chaîne vide [ ].
La fonction logique isvarname('var') retourne 1 si var est un nom de variable valide, sinon elle retourne 0.
Les mots clefs du langage MATLAB ne peuvent pas être utilisés comme nom de variable. La fonction
iskeyword('var') retourne 1 si var est un mot clef de MATLAB, sinon elle retourne 0.

function mafonc(a,b) x = 5;
s = inputname(1); y = 3;
disp([‘Premier appel de variable est ''' s '''.']) mafonc(x,y)
end Premier appel de variable est "x".

6
Prof. LAMRI B.
Variables locales:
Les variables locales sont les variables définies dans le corps d’une fonction:
 elles sont connues uniquement à l’intérieur de la fonction;
 elles résident dans l’espace de travail de la fonction (différent de l’espace de travail global);
 l’espace mémoire qu’elles occupent est libéré au retour de la fonction (sauf si persistent).
On peut considérer trois familles de variables locales:
 les paramètres d’entrée: ce sont des variables locales initialisées;
 les paramètres de sortie: ce sont des variables locales à calculer;
 les variables locales proprement dites.

Variables globales: Si plusieurs fonctions, et possible l’espace de travail global, doivent partager une même
copie d’une variable sans passer par la transmission en entrée et en sortie des dites fonctions, cette variable doit
être déclarée globale à l’aide de l’instruction global partout où elle doit être connue (elle sera inconnue ailleurs).
La fonction logique isglobal(var) retourne 1 si la variable var a été déclaré globale, sinon elle retourne 0.
La commande clear global efface toutes les variables globales.
N.B.:
 Si la valeur initiale d’une variable globale est [ ], penser à utiliser la fonction isempty.
 Le respect des bonnes règles de programmation recommande de ne pas utiliser de variables globales
sauf cas extrême, après avoir épuisé toutes les alternatives possibles.

Variables persistantes: Si la valeur d’une variable locale doit persister d’un appel à l’autre de la fonction dans
laquelle elle se trouve, cette variable doit être déclarée persistante à l’aide de l’instruction persistent.
Si une variable a été déclarée persistent dans une fonction fonc, sa valeur persiste jusqu’à la commande: clear
fonc qui efface fonc.m de l’espace de travail global, ou clear all qui efface toutes les variables et toutes les
fonctions.
N.B.:
 La valeur initiale d’une variable persistante est [ ], penser à utiliser la fonction isempty.
On peut prévenir l’effacement d’une fonction, et donc de ses variables persistantes, lors d’une commande clear
en bloquant cette fonction à l’aide de la fonction mlock.
La fonction munlock permet de la débloquer de sorte que les prochains appels à clear pourront à nouveau
l’effacer de l’espace de travail global.
La fonction mislocked permet de savoir si une fonction est bloquée ou non.
Ex. mislocked(‘nom’) donne 0 (non) ou 1 (oui)
7
Prof. LAMRI B.
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.
Les nombres d’arguments peuvent varier d’une utilisation à une autre d’une même 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: narg=nargin('fonc');
narg=nargout('fonc');
narg est négatif si la fonction fonc est déclarée comme ayant un 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=fonc(x,varargin)
function [y,varargout]=fonc(x)
Dans la déclaration, chaque instruction doit être écrite en minuscules et doit être la dernière variable de la liste
des arguments.

5. Liens vers d’autres langages :


MATLAB propose des interfaces qui permettent:
 d’appeler un autre langage de programmation depuis un script ou une fonction MATLAB;
 d’invoquer le moteur de calcul de MATLAB depuis un autre langage de programmation;
 d’accéder aux fichiers de données de MATLAB .mat depuis un autre langage de programmation.

6. Exemples :
6.1 Factoriel de n (n!): Cette fonction peut s’appeler elle-même
C’est une fonction récursive
function nn =factoriel(n)
% Cette fonction calcule le n factoriel (n!) en fonction de la valeur de n.
reponse=1;
if n==0
nn=1;
else
8
Prof. LAMRI B.
reponse= n*factoriel(n-1);
factoriel(8) = 40320
end; %if
Les lignes de commentaire situées entre la ligne function ... et la
nn=reponse; 1ère ligne d'instructions sont affichées si l'on demande de l'aide sur
la fonction.
>>help factoriel ça nous donne le commentaire de la 2 ème ligne.

6.2 Fonction modulo qui calcule la valeur de a modulo n (x≡a[n])


function [r,q] = modulo(a,n)
% Calcule la valeur de a modulo n en prenant pour système de résidus
% 1, ... , n au lieu de 0, ... , n-1. Application1
>> b = 10 ; m = 4;
% appel : [r,q] = modulo(a,n) >> [r,q] = modulo(b,m)
% Arguments de sortie : résultats: r = 2 et q = 2

% r : le residu
% q : le quotient
Application2
q = floor(a./n); >> modulo(10,5)
r = a - n*q; ans = 5

% si le reste de la division entiere vaut 0, le residu vaut par convention n


if r == 0, r = n; end

rem : le reste de la division entière de deux entiers (syntaxe rem(m,n)).


lcm(m,n) et gcd(m,n) retournent respectivement le PPMC et le PGCD à deux entiers m et n. factor(n) permet
d'obtenir les termes de la décomposition en facteurs premiers de l'entier n.

Les fonctions d'arrondis


round(x) entier le plus proche de x,

floor(x) arrondi par défaut,

ceil(x) arrondi par excès,

fix(x) arrondi par défaut un réel positif et par excès


un réel négatif.

9
Prof. LAMRI B.
6.3 Fonction pour passer en coordonnées polaires
Paramètres d’entrée : Paramètres de sortie :
Abscisse x Rayon r  x2  y 2

Ordonnée y Argument  y
  arctan 
x

function [r , theta] = polaire(x, y)


polaire : nom de la fonction
% Fonction pour passer function : mot réservé pour la définition de la fonction
% en coordonnées % : commentaires accessibles à l’aide de help polaire
r,theta : paramètres de sortie
% polaires x,y : paramètres d’entrée
r=sqrt(x.^2+y.^2) ;
theta=atan(y./x) ;

Si seul le rayon nous intéresse : >>r=polaire(2,3) ou bien >>polaire(2,3) on aura : ans =3.6056
Si on veut récupérer à la fois le rayon et l’angle: >>[r,t]=polaire(2,3) on aura : r = .932 t= 3.6056

6.4 Calcul de la moyenne d’un ensemble de nombres


function y=moyenne(x)
%moyenne ou valeur moyenne
y=sum(x)/length(x) ;
Exemple d’appel de moyenne:
>> z=1:99 ; moyenne(z) ans=50

6.5 Autres fonctions


>>f=inline(’t^3-2*t+5’); zplot(f)
>>g=@(t) besselj(0,t); ezplot(g)
>>f = @(t,g) 0.5*g*t.^2

t=0:0.01:10; figure(1);
plot(t,f(t,9.8),'b-')
xlabel('Temps (secondes)'); ylabel('Distance (mètre)')
title('Distance vs.Temps')

10
Prof. LAMRI B.
7. Exercice :
x5  3
Écrire un .m file pour la fonction f ( x) 
x2  1

Tester la fonction sur quelques valeurs, par exemple vérifier que : f(1) = -1.4142, f(0) =-3
1. Tester la fonction sur quelques valeurs, par exemple vérifier que : f(1) = -1.4142, f(0) =-3
2. Créer un tableau x d’abscisses de -5 à 5 par pas de 0.1
3. Représenter la fonction f aux points x , avec la commande plot(x,f(x))

Fichier f.m
function y=f(x)
y=(x.^5-3)./(sqrt(x.^2+1));
2) x=-5:0.1:5
3) plot(x,f(x))

11
Prof. LAMRI B.

Vous aimerez peut-être aussi