Vous êtes sur la page 1sur 45

PROGRAMMATION SOUS MATLAB

D. Legland

29 mai 2015
Table des matires
1. Introduction 4

I. Programmer avec Matlab 5


2. Syntaxe de base 6
2.1. Types de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2. Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3. Boucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3. Conventions de programmation 8
3.1. Nommage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2. Codage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.3. Documentation des fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.4. Modules et bibliothques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.5. Compatibilit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

II. Programmation oriente objets 14


4. Structures de donnes et classes  par valeur  16
4.1. Structures de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.2. Objets par valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

5. Programmation oriente objets 19


5.1. Dclaration de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2. Cration et utilisation des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.3. Mthodes prives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.4. Mthodes statiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.5. Autres mthodes particulires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

6. Hritage de classe 25
6.1. Crer et utiliser une hirarchie de classes . . . . . . . . . . . . . . . . . . . . . . 25
6.2. Afficher les objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.3. Surcharger les oprateurs mathmatiques . . . . . . . . . . . . . . . . . . . . . . 26
6.4. Surcharger subsref et subsasgn . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.5. Surcharge des oprations de tableau . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.6. Mthodes et classes abstraites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

2
Table des matires

7. Bonnes pratiques en programmation oriente objet 31


7.1. Conventions de nommage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.2. Construction des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.3. Grer des tableaux dobjets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.4. Paquetages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

III. Concepts avancs 34


8. Interfaces graphiques 35
8.1. Concevoir ses interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
8.2. Les composants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
8.3. vnements graphiques (callbacks) . . . . . . . . . . . . . . . . . . . . . . . . . . 36
8.4. vnements fentre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
8.5. Gestion de la souris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

9. Exceptions et gestion des erreurs 40


9.1. Principe des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
9.2. Traiter une exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
9.3. Crer ses erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

10.Gestion des vnements 42


10.1. Dfinir un vnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
10.2. Diffuser un vnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
10.3. Dfinir un listener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
10.4. Regrouper la gestion des vnements . . . . . . . . . . . . . . . . . . . . . . . . . 44
10.5. Personnaliser un vnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

tutoProgMatlab.lyx page 3 sur 45


1. Introduction
Ce document rassemble diffrents lments de pratique de programmation sous Matlab.
Au fur et a mesure de la rdaction, il apparait quil pourrait servir de tutoriel sur la progam-
mation Matlab, en particulier sur la programmation oriente objets (POO).
La premire partie concerne des gnralits sur le langages. Le chapitre 3 pose les conven-
tions que jutilise. La deuxime partie reprend mes notes sur les structures de donnes et la
programmation oriente objets (chapitres 4, 5 et 6). La troisime partie aborde des thmes
plus techniques, qui reposent le plus souvent sur la manipulation et / ou la cration de
classes : la conception dinterfaces graphiques (chapitre 8), la gestion des exceptions et des
erreurs (chapitre 9), et enfin une proposition darchitecture pour manipuler les vnements
Matlab de manire similaire Java (chapitre 10).

4
Premire partie .
Programmer avec Matlab

5
2. Syntaxe de base
Ce chapitre rappelle trs brivement quelques lments fondamentaux de la programma-
tion sous Matlab : les types de donnes, et les structures de contrle (tests, boucles...).

2.1. Types de donnes


Les donnes manipules peuvent tre :
des nombres en virgule flottante,
des nombres complexes (du type a + i b)
des nombres entiers (signs ou non)
des chanes de caractres
des tableaux (de valeurs ou de cellules)

2.2. Tests
2.2.1. Tests if-then-else
On dcoupe le programme en plusieurs blocs, et on execute un bloc ou lautre en fonction
dune condition.
1 if a > b
2 res = a ;
3 else
4 res = b ;
5 end

2.2.2. switch
Permet de grer plusieurs tests en mme temps. Trs pratique avec les chanes de carac-
tres.
1 switch option
2 case ' v r a i '
3 d i s p ( 'OK ' ) ;
4 case ' faux '
5 d i s p ( ' Pas bon ' ) ;
6 default
7 e r r o r ( [ ' V a l e u r inconnue pour o p t i o n : ' option ]) ;
8 end

6
2.3 Boucles

2.3. Boucles
2.3.1. Boucles for
Outre la boucle for classique, on peut utiliser dautres syntaxes.

2.3.1.1. Boucle for classique


1 f o r i = 1:5
2 disp ( 2 i ) ;
3 end

2.3.1.2. Itration sur des tableaux


Il est possible dutiliser les tableaux la manire des collections en Java. Exemple :
1 tab = 1:5;
2 f o r i = tab
3 disp ( i ) ;
4 end

Note : on itre en fait sur les colonnes (cest dire sur la dimension 2). Le reste du tableau
est simplifi. On peut aussi itrer sur un tableau de cellules :
1 i n d s = c e l l s t r ( num2str ( ( 1 : 5 ) ' , ' ind%d ' ) ) ' ;
2 for i = inds
3 disp ( i {1}) ;
4 end

L aussi on itre sur les colonnes du tableau, do la deuxime transposition du tableau


inds .

2.3.1.3. Boucle for parallle


Il sagit de la mme syntaxe que la boucle for, mais cette version permet de parallliser les
calculs faits dans la boucle. Ne doit pas tre utilis si les calculs dpendent dune itration
prcdente...
1 p a r f o r i = 1:5
2 r e s ( i ) = maFonction ( i ) ;
3 end

tutoProgMatlab.lyx page 7 sur 45


3. Conventions de programmation
Rsum de quelques conventions de codage prconises pour le langage Matlab. On peut
aussi consulter le document de Richard Johnson 1 , dont ce document est en grande partie
inspir. Le chapitre sur la POO redonne quelques conventions/bonnes pratiques spcifiques.

3.1. Nommage
De manire gnrale, on vite les caractres spciaux dans les noms, et on se limite aux
caractres alphabtiques. Il est prfrable demployer des noms anglais. Cela permet (1)
dhomogniser la langue du code et (2) dviter les problmes dus aux accents... On vite
les numros sauf pour des fichiers temporaires ou de donnes.
Le seul caratre spcial tolr ( part les caractres spciaux imposs par Matlab, tels @
ou + ) est le caractre soulign _ . Il est utiliser pour nommer les constantes statiques.
Attention au caractre - , qui est interprt par Matlab comme une soustraction...

3.1.1. Noms de chiers


Les fichiers Matlab peuvent contenir des scripts, des fonctions ou des classes. Ils ont tous
lextension .m . Il ny a pas de limite sur le nombre de caractres.
De manire gnrale, il est prfrable dcrire les noms de fichier en minuscule. Pour les
noms composs, on utilise la syntaxe qui consiste coller les noms et mettre en majuscule
la premire lettre de chaque mot. Exemple : nomDeLaFonction. Exception : les noms de
classe, qui commencent par une majuscule.

3.1.2. Noms des fonctions


La convention Matlab est de stocker les fonction dans des fichiers qui portent leur nom.
On applique donc aux fonctions les mmes conventions que pour les noms de fichier.
Dans la mesure du possible, on utilise des noms de fonction qui commencent par des
verbes. Cela permet de diffrencier les variables (noms) et les fonctions (verbes). Exemple :
1 d i s t a n c e = computeDistance ( . . . )

On peut utiliser des prfixes pour des groupes de fonctions qui travaillent sur des types
communs. Par exemple, des fonctions qui travaillent sur des donnes polygones peuvent
avoir les noms : polygonArea, polygonCentroid... Autre exemple : un prfixe im pour
les fonctions travaillant sur des images (conventions utilise par la bote outils Image
Processing de Mathworks).
1. http://www.datatool.com/downloads/matlab_style_guidelines.pdf

8
3.2 Codage

3.1.3. Noms des classes


Matlab permet la programmation oriente objet. Afin de diffrencier les classes et les fonc-
tion, jutilise comme convention de nommer les classes en commenant par une majuscule.
Les variables membres et les mthodes suivent la convention gnrale de nommage ( nom-
DeMembre , nomDeMethode ...).

3.2. Codage
3.2.1. Commentaires
Penser mettre des commentaires dans les codes... Matlab est un langage concis, il est
donc trs facile dcrire des lignes courtes mais obscures. Lide est de rsumer lintention.
Une proportion de 30 50% de commentaire semble correcte.
On prfrera les commentaires sur une ligne, commenant par le caractre % , suivi
dune espace, et du commentaire commenant par une majuscule. Exemple :
1 % Exemple de commentaire

3.2.2. Ponctuation
On termine les instructions par un point-virgule, sans mettre despace avant. Cela permet
(1) davoir une syntaxe similaire dautres langages comme C ou Java, et (2) de ne pas
afficher les rsultats intermdiaires.
On vite les point-virgule la fin des instructions end , cela surcharge la lecture. On en
met la fin des mots-cls return , continue , qui sont considres comme des instructions
part entires.

3.2.3. Arer le code


Lcriture du code doit tre relativement are. Quelques principes gnraux :
une instruction par ligne si possible
une espace avant et aprs le signe daffectation "="
on vite les parenthses autant que possible (notamment pour les tests et les boucles)
on essaie de faire tenir les lignes dans la limite de 80 caractres. Lditeur de Matlab
permet dafficher la limite, et de passer la ligne automatiquement.
on prconise souvent de mettre des espaces autour des oprateurs mathmatiques,
voir selon les cas...

3.2.4. Structuration du code


On essaie de faire des blocs fonctionnels , composs de quelques lignes, qui soccupent
dune tche donne, et que lon commente.
Les structures de contrle (boucles, tests...) sont indentes avec quatre caractres espace.
On vite les tabulations, qui apparaissent diffremment selon les diteurs. Lidal est de les

tutoProgMatlab.lyx page 9 sur 45


3 Conventions de programmation

remplacer par quatre caractres espace. On vite dcrire les boucles ou les tests sur une
seule ligne.
Exemple :
1 % I n i t i a l i s a t i o n des donnes
2 data = z e r o s ( 1 , N) ;
3 f o r i = 1 :N
4 value = g e t I n i t V a l u e ( i ) ;
5 data ( i ) = i n i t D a t a ( v a l u e ) ;
6 end

3.2.5. Ecrire du code court


On vite les encapsulations dindentation. Un niveau de 3 ou 4 indentations devrait tre
un maximum. Sinon, essayer de faire des sous-fonctions.
On vite les boucles ou les tests trop longs en terme de nombre de lignes.

3.3. Documentation des fonctions


Les commentaires en dbut des fichiers de fonctions peuvent tre utiliss pour construire
automatiquement la documentation. Il est donc prfrable de les soigner...
La premire ligne du fichier contient la dclaration de la fonction, suivie de len-tte, puis
du code.

3.3.1. Ligne d'entte ( h1 )


La premire ligne de la documentation contient le nom de la fonction en majuscule, suivi
dune courte description (qui tient sur la ligne). Pour homogniser, il est prfrable de
lcrire en anglais, en commenant par un verbe linfinitif, avec la premire lettre en ma-
juscule.
Exemple :
1 f u n c t i o n r e s = demoFunction ( x , n )
2 %DEMOFUNCTION Compute a sample f u n c t i o n o f x and n
3 ...

3.3.2. Description de la fonction


Le reste de lentte doit contenir lexplication de la syntaxe dutilisation de la fonction,
avec la description des paramtres.
Suggestion de syntaxe : crire le nom des fonctions tel quel, crire les paramtres en
majuscule. Lide est de favoriser le copier-coller aprs avoir tap un help. La description
utilise des verbes conjugus.
Exemple :
1 f u n c t i o n r e s = demoFunction ( x , n )
2 %DEMOFUNCTION Compute a sample f u n c t i o n o f x and n
3 %

tutoProgMatlab.lyx page 10 sur 45


3.3 Documentation des fonctions

4 % RES = demoFunction (X , N)
5 % Computes t h e N- t h power o f t h e number X .
6 %
7 % RES = demoFunction (X , N, METHOD)
8 % S p e c i f i e s t h e method t o u s e . METHOD can be one o f :
9 % ' normal ' : use t h e normal method
10 % ' optimized ' : use t h e o p t i m i z e d method

Un en-tte de fonction peut aussi contenir un section dexemples, et une section See
also , qui fait rfrence des fonctions voisines. Les sections couramment utilises dans
laide de Matlab sont :
Syntax
Description
Examples
See also
Algorithm
References
Il est possible dinclure des liens hypertexte dans laide, et de faire excuter du code Matlab
quand on clique dessus.
1 d i s p ( '<a h r e f =" matlab : magic ( 4 ) "> Generate magic square </a> ' )

3.3.3. Liens entre fonctions


Les noms de fonctions renseignes aprs la balise See also gnrent automatiquement
des liens hypertexte. Cest assez pratique pour naviguer entre des fonctions apparentes. Si
un fichier Contents.m existe (voir ci-dessous), on peut aussi donner le nom du module,
ce qui permet crer une bauche de navigation.
Il est aussi possible dinclure explicitement des liens hypertexte vers dautres fonctions.
Exemple :
1 % See t h e h e l p f o r t h e <matlab : doc ( ' p u b l i s h ' ) p u b l i s h > f u n c t i o n .

3.3.4. Cartouche
La fin de len-tte devrait contenir le nom de lauteur, la date de cration, et une mention
de copyright. Un outil comme tedit 2 permet dajouter automatiquement un cartouche
pr-dfini tout nouveau fichier. Exemple de cartouche :
1 % ------
2 % Author : Name and g i v e n name
3 % e - mail : m y . n a m e @ c e n t r e . i n r a . f r
4 % C re a t ed : 2011 -04 -01 , u s i n g Matlab 7 . 9 . 0 . 5 2 9 ( R2009b )
5 % C o p y r i g h t 2011 INRA - My L a b o r a t o r y

2. http://www.mathworks.com/matlabcentral/fileexchange/8532-tedit

tutoProgMatlab.lyx page 11 sur 45


3 Conventions de programmation

3.4. Modules et bibliothques


On peut regrouper des fonctions voisines dans des rpertoires, et crer un paquetage ou
module. Il suffit que le rpertoire en question soit accessible via le path.
Si le rpertoire du module est accessible depuis Matlab, un help avec le nom du module
permet dafficher la premire ligne des en-tte des fonctions du module.

3.4.1. Fichier Contents.m


On peut aussi crer un fichier Contents.m , qui est affich si on appelle laide de Matlab
sur le module. Lide dun tel fichier est de prsenter un sommaire des fonctions du rpertoire.
Chaque fonction apparat ainsi avec la premire ligne de son en-tte.
Le fichier Contents peut tre gnr automatiquement par Matlab, via un content report .
Il contient basiquement la liste des fonctions accompagnes de leur description courte. Il
peut tre retravaill, pour grouper les fonctions similaires, et pour donner une description
gnrale du module.
Quelques prcautions prendre :
Le systme daide de Matlab utilise le fichier Contents.m , mais ne trouve pas le
fichier contents.m ...
Matlab naime pas les liste puces commenant par des tirets ( - ), il lui arrive de les
faire disparatre (confusion avec les rsums de fonction ?). Recommandation : utiliser
des astrisque ( * ).

3.4.2. Infos de version


Les deux premires lignes du fichier Contents.m sont analyses par Matlab pour fournir
des informations de version (par la commande ver ).
1 % Toolbox d e s c r i p t i o n
2 % V e r s i o n xxx dd -mmm- yyyy .

La convention de Matlab est de donner uniquement la description de la bibliothque. Je


prfre ajouter le nom, a permet de la retrouver a posteriori. Il faut aussi avoir un point
la fin de la deuxime ligne pour que la date soit prise en compte (2009b).

3.4.3. Numrotation des versions


Grande question... Lide est de numroter par majeur.mineur.correctif. Une alternative est
dutiliser systmatiquement la date de release (format yyyy-mm-dd).

3.5. Compatibilit
Quelques points pour faciliter le passage entre diffrents systmes dexploitation :
La gestion des noms de fichiers devrait se baser sur les fonction fullfile et fileparts ,
qui se chargent de grer les sparateurs de fichier

tutoProgMatlab.lyx page 12 sur 45


3.5 Compatibilit

Lutilisation des ... la fin dune ligne pourrait causer des problmes de compatibilit
pour les passages de Linux Windows ( vrifier).

tutoProgMatlab.lyx page 13 sur 45


Deuxime partie .
Programmation oriente objets

14
Pour regrouper ses fonctions utilitaires, une pratique courante dans certains langages de
programmation est dutiliser la programmation oriente objets (POO). On cre des objets
ayant certains attributs, et on les modifie ou on fait des calculs avec en appelant leurs m-
thodes, qui sont des fonctions spcifiques lobjet.
Matlab offre plusieurs mcanismes pour manipuler des objets. Les plus simples sont les
structures, mais elles ne permettent pas de crer de mthodes spcifiques. Depuis la version
2006 ( ?), Matlab propose une gestion simplifie des objets, qui permet de crer ses propres
types de donnes, mais qui reste assez limite. Enfin, depuis 2008, la gestion des objets dans
un sens plus classique a t introduite, qui permet plus de possibilits et de rigueur, au prix
dun lger apprentissage.
Un premier chapitre prsente les structures de donnes, ainsi que les objets par valeurs,
qui corerspondent lancienne version des objets. Un deuxime chapitre prsente la cra-
tion et lutilisation des objets par rfrence ( handle-based ) . Le chapitre suivant prsente
lhritage de classe, qui permet de construire des objets en rutilisant une partie du code.
On termine ensuite avec quelques bonnes pratiques de programmation objet.

tutoProgMatlab.lyx page 15 sur 45


4. Structures de donnes et classes
 par valeur 
Il existe plusieurs manire daborder la programmation oriente objets sous Matlab. Les
structures de donnes permettent dencapsuler et dorg des donnes htrognes. Il est en-
suite possible de leur associer des fonctions, ce qui donne les objets dit par valeur . La
gestion des objets par rfrence sera vue au chapitre suivant.

4.1. Structures de donnes


Les structures permettent dagglomrer des donnes htrognes (nombres, tableaux, chanes,
autres structures...), et sont la base du concept de classe.

4.1.1. Dclaration et utilisation


La dclaration dune structure est plutt simple :
1 personne.nom = ' Dupont ' ;
2 personne.prenom = ' T h i e r r y ' ;
3 p e r s o n n e . a g e = 23;

On peut aussi assigner ou rcuprer les champs de manire dtourne, en plaant le nom
du champ dans une variable :
1 champ = ' nom ' ;
2 nom = g e t f i e l d ( personne , champ ) ;

Il sagit dune mthode simple pour passer des arguments une fonction.
Il est aussi possible dutiliser la syntaxe suivante :
1 nom = p e r s o n n e . ( ' nom ' ) ;

4.1.2. Tableaux de structures


On peut aussi accder aux lments dune structure dans un tableau :
1 nom3 = p e r s o n n e s ( 3 ) .nom ;

Dans le cas dun tableau de structures, on peut aussi rcuprer lensemble des valeurs pour
un champ donn, en utilisant une des syntaxes suivantes :
1 noms = { personnes.nom } ;
2 ages = [ p e r s o n n e s . a g e ] ;

16
4.2 Objets par valeur

Un inconvnient est que lon perd le dimensionnement du tableau de dpart : on obtient


en sortie un vecteur colonne. Dans les cas o cest ncessaire, on peut redimensionner avec
linstruction reshape :
1 ages = r e s h a p e ( [ p e r s o n n e s . a g e ] , s i z e ( p e r s o n n e s ) ) ;

4.1.3. Fonctions utiles


Matlab fournit quelques fonctions pratiques pour manipuler les structures :
eldnames(S) liste les champs de la structure
iseld(S, NAME) pour tester si le champs NAME existe (NAME est une chane de ca-
ractres)

4.2. Objets  par valeur 


Premire version des classes sous Matlab. Elles sont appeles value object dans la doc
Matlab. On manipule tout instant une copie des objets. Les consquences directes sont (1)
une occupation mmoire plus grande et (2) la ncessit de renvoyer un objet modifi ds
que lon veut changer son tat.

4.2.1. Dclaration
On commence par crer un rpertoire @MaClass, qui contient toutes les fonctions qui
sappliqueront ce type dobjets.
On dfinit ensuite un constructeur, dont la tche principale est daffecter un nom de classe
lobjet. Ce constructeur a le mme nom que le rpertoire dans lequel il est plac, sans
larobase.
1 f u n c t i o n o b j = MaClass ( data )
2 %MACLASS c r e e un o b j e t de t y p e MaClass
3 o b j . d a t a = data ;
4 o b j = c l a s s ( obj , ' MaClass ' ) ;

Un objet se cre ensuite par un appel la fonction MaClasse


1 > o b j = MaClass ( ' maDonnee ' ) ;

4.2.2. Manipulation
Pour agir sur lobjet, on ajoute des fonctions dans le rpertoire de la classe. Si la fonction
est appele, cest quau moins un des arguments est un objet de la classe considre. On peut
ainsi rcuprer les valeurs des champs de lobjets, et renvoyer ou afficher un rsultat.
1 f u n c t i o n showData ( o b j )
2 %SHOWDATA a f f i c h e l e s donnees de l ' o b j e t
3 d i s p ( ' Donnees de l o b j e t : ' ) ;
4 disp ( obj.data ) ;

tutoProgMatlab.lyx page 17 sur 45


4 Structures de donnes et classes par valeur

4.2.3. Modication
Pour modifier un objet, il faut en crer un nouveau et le renvoyer :
1 f u n c t i o n o b j = m o d i f i e r ( obj , newData )
2 %MACLASS c r e e un o b j e t de t y p e MaClass
3 o b j . d a t a = newData ;

On modifie un objet de la faon suivante :


1 > o b j = m o d i f i e r ( obj , ' N o u v e l l e Donnee ' ) ;
2 > showData ( o b j )
3 Donnees de l ' o b j e t :
4 N o u v e l l e Donnee

Linconvnient de cette approche est que pour des objets volumineux (un polygone, une
image, un maillage...), la totalit de lobjet est passe en argument, ce qui conduit une
utilisation mmoire intensive.

tutoProgMatlab.lyx page 18 sur 45


5. Programmation oriente objets
Ce chapitre prsente la gestion des objets introduite depuis la version 2008b. Cette version
permet notamment de grer des objets par rfrence, cest dire qui peuvent tre modifis et
qui gardent trace de leur modification (contrairement aux objets pre-2008). On commence
par prsenter la dclaration des objets, puis des diffrents types de mthodes (les fonctions
assoxies aux objets).

5.1. Dclaration de classe


Les classes peuvent tre dfinies soit entirement dans un fichier, soit dans un rpertoire
propre. Dans le cas dun rpertoire, le nom du rpertoire commence par un arobase (caractre
@), et le reste correspond au nom de la classe.

5.1.1. Dclaration
Pour chaque classe, on cr au minimum un fichier NomDeLaClasse.m. Ce fichier contient
la dclaration des champs, des constructeurs, et ventuellement dautres mthodes. La dfi-
nition dune classe se fait dans un bloc classdef , qui comprend tout le fichier :
1 c l a s s d e f NomDeLaClasse < NomClasseParente
2 . . . % d c l a r a t i o n de l a c l a s s e
3 end

Le signe < sert indiquer la ou les classes parentes. Pour manipuler des objets par
rfrence, il faut que la classe hrite de la classe handle , ou dune classe qui hrite elle-
mme de handle.

5.1.2. Dclaration des variables membre


Dans la suite du fichier, on dclare les variables locales contenues dans chaque objet. On
peut spcifier des valeurs par dfaut.
1 ...
2 % D c l a r e l e s champs l a s u i t e
3 properties
4 x = 0;
5 y = 0;
6 end % f i n d e c l champs
7 ...

19
5 Programmation oriente objets

5.1.3. Dclaration des mthodes


Une mthode se dclare dans le corps de la dclaration de la classe. On commence en
gnral par le ou les constructeurs, qui crent une nouvelle instance de la classe partir des
arguments passs en paramtre.

tutoProgMatlab.lyx page 20 sur 45


5.2 Cration et utilisation des objets

Exemple de dclaration complte :


1 c l a s s d e f Point2D < handle
2 ...
3 % D c l a r e l e s d i f f e r e n t e s methodes
4 methods
5 % Dclare le constructeur
6 f u n c t i o n t h i s = Point2D ( x , y )
7 t h i s . x = 0;
8 t h i s . y = 0;
9 end % f i n d e c l . c o n s t r u c t e u r
10
11 % d e c l a r e une methode de l a c l a s s e
12 % ( a j o u t e r l e s corodonnees de deux p o i n t s )
13 f u n c t i o n r e s = addCoords ( t h i s )
14 res = t h i s . x + t h i s . y ;
15 end % f i n d e c l . de l a methode ' addCoords ' ;
16
17 % d e c l a r e une a u t r e methode
18 % ( c a l c u l de l a d i s t a n c e e n t r e deux p o i n t s )
19 function dist = distance ( this , that )
20 d i s t = hypot ( t h i s . x - t h a t . x , t h i s . y - t h a t . y ) ;
21 end
22
23 end % f i n d e c l methodes
24 end % f i n d e c l c l a s s e

Il est aussi possible dcrire chaque mthode dans un fichier spar. Cela montre mieux
quelles sont les mthodes implmentes ou surcharges, et vite davoir un fichier de classe
trop gros.

5.2. Cration et utilisation des objets


Pour construire un objet (cest dire instancier une classe), on passe par un appel au
constructeur :
1 > p1 = Point2D ( 2 , 3) ;
2 > p2 = Point2D ( 5 , 7) ;

Pour appeler une mthode, plusieurs syntaxes sont possibles :


1 > r e s 1 = p1.addCoords ;
2 > r e s 2 = p1.addCoords ( ) ;
3 > r e s 3 = addCoords ( p1 ) ;

La deuxime syntaxe est prfrable. La premire introduit une confusion entre les noms
de champs et de mthode, tandis que la troisime risque dintroduire des conflits de noms.
(Au niveau technique, les deux premires ajoutent aussi un appel la fonction subsref, voir
comment cela se traduit au niveau des performances).
Pour appeler des mthodes sur plusieurs objets :
1 > d12 = p 1 . d i s t a n c e ( p2 )
2 d12 =
3 5

Ici, la mthode est appele sur lobjet p1 , avec comme deuxime argument lobjet p2 .

tutoProgMatlab.lyx page 21 sur 45


5 Programmation oriente objets

5.3. Mthodes prives


Les mthodes prives ne sont accessibles que depuis les mthodes de la classe. Elle per-
mettent de partager du code entre les diffrentes mthodes, sans que ce code ne soit rendu
public. Cela concerne typiquement du code dinitialisation, ou du code de vrification de
lintgrit des donnes de la classe.

5.3.1. Mthodes prives dans la dclaration de classe


Si toutes les mthodes sont dclares dans un mme fichier, les fonctions prives doivent
tre dclares dans un bloc spar. On cre un bloc de dclarations de mthodes, pour lequel
on spcifie laccs priv private , et on place le code des fonctions prives :
1 c l a s s d e f ClassName
2 % dans l e b l o c des mthodes , on c r i t l e p a t r o n de l a mthode
3 methods ( A c c e s s = p r i v a t e )
4 f u n c t i o n r e s = maFonction ( t h i s , arg1 , arg2 )
5 % . . . code de l a f o n c t i o n p r i v e
6 end
7 end
8 end

5.3.2. Mthodes prives dans un chier spar


Si on a dclar la fonction dans un rpertoire spcifique ( @-rpertoire ), on peut crire
le code dans un fichier spar. Il faut quand mme dclarer la fonction le bloc de dclaration
des mthodes de la classe, afin de pouvoir la rendre prive.
1 c l a s s d e f ClassName
2 % dans l e b l o c des mthodes , on c r i t l e p a t r o n de l a mthode
3 methods ( A c c e s s = p r i v a t e )
4 r e s = maFonction ( t h i s , arg1 , arg2 )
5 end
6 end

On crit ensuite le code de la mthode dans un fichier appel maFonction.m , qui se


trouve dans le rpertoire de la classe.
1 % f i c h i e r " maFonction.m "
2 f u n c t i o n r e s = maFonction ( t h i s , arg1 , arg2 )
3 % i c i , l e code de l a f o n c t i o n p r i v e
4 end

5.3.3. Mthodes locales


Quand on dfinit une classe dans un rpertoire, on peut crer un rpertoire private .
Les fonctions prsentes dans ce rpertoire sont utilisables depuis les mthodes de la classe,
mais ne sont pas visible de lextrieur. Elles se comportent comme des mthodes prives,
la diffrence que le premier argument ne doit pas tre la rfrence de lobjet.

tutoProgMatlab.lyx page 22 sur 45


5.4 Mthodes statiques

5.4. Mthodes statiques


Il est possible de dclarer des mthodes statiques, qui seront partages par toutes les ins-
tances de la classe. Ces mthodes ne peuvent manipuler les donnes membres de la classe.
Leur intrt est soit de regrouper des fonctions oprant sur des objets dune classe donne,
soit de dfinir des constantes ou des mthodes spcifiques la classe dobjets utilise.
Les mthodes statiques se dclarent de la mme manire que des mthodes classiques,
en ajoutant le mot-cl Static (avec la majuscule). Pour utiliser une mthode statique, on
utilise le nom de la classe, suivi du nom de la mthode
1 r e s = NomDeClasse.nomDeMethode ( . . . ) ;

5.4.1. Exemple 1 : calcul de avec une prcision arbitraire


On commence par dfinir une classe Math contenant une mthode pi , qui accepte
un argument de tolrance numrique en entre.
1 c l a s s d e f Math
2 methods ( S t a t i c )
3 % c a l c u l e P I avec une p r e c i s i o n donnee
4 function p = pi ( t o l )
5 [ n , d ] = r a t ( pi , t o l ) ;
6 p = n/d ;
7 end
8 end
9 end

On calcule ensuite selon diffrentes prcisions :


1 pi1 = Math.pi ( .1 )
2 pi1 =
3 3 .1429
4 p i 2 = M a t h . p i ( .001 )
5 pi2 =
6 3 .1416

5.4.2. Exemple 2 : calcul de la distance entre deux points


criture de la classe :
1 c l a s s d e f Point2D
2 ...
3 methods ( S t a t i c )
4 % C a l c u l e l a d i s t a n c e e n t r e deux p o i n t s
5 f u n c t i o n d = d i s t a n c e P o i n t s ( p1 , p2 )
6 % c a l c u l e l a d i s t a n c e par P y t h a g o r e
7 d = hypot ( p1.x - p2.x , p1.y - p 2 . y ) ;
8 end % f i n de l a methode s t a t i q u e
9 end

Exemple dappel :
1 p1 = Point2D ( 2 , 3) ;
2 p2 = Point2D ( 5 , 7) :
3 d = P o i n t 2 D . d i s t a n c e P o i n t s ( p1 , p2 )

tutoProgMatlab.lyx page 23 sur 45


5 Programmation oriente objets

4 d =
5 5.0

5.4.3. Limitations
On ne peut pas se passer du nom de la classe pour appeler une classe statique. Cela im-
plique des lignes de code un peu longues, et peut tre pnible pour des hirarchies de classe
un peu touffues.
On peut redfinir une classe statique dans une classe drive, condition que la classe
ne soit pas scelle (quivalent du mot-cl final en java, qui se traduit en Matlab par
Sealed = true ).
On ne peut pas avoir de champs de classe statiques. Cela peut tre pnible pour certaines
classes (typiquement une classe singleton). On peut sen sortir en utilisant des variables
persistantes dans le corps dune mthode statique.

5.5. Autres mthodes particulires


Certaines mthodes spcifiques sont appeles dans certains cas particuliers : set, loadobj,
saveobj... Un help handle permet de les lister, afin ventuellement de r-implmenter
celles qui le ncessitent.

tutoProgMatlab.lyx page 24 sur 45


6. Hritage de classe
Utiliser lhritage permet de gagner en modularit, et parfois en clart. Ce chapitre pr-
sente la gestion de lhritage de classes sous Matlab, et se consacre ensuite quelques tech-
niques particulires que lon peut utilsier pour lhritage.

6.1. Crer et utiliser une hirarchie de classes


6.1.1. Dclaration de l'hritage
On utilise le signe < , suivi du nom de la classe parente :
1 classdef C l a s s e F i l l e < ClasseParente

Si on dclare un objet de la classe ClasseFille, alors elle bnficiera de toutes les fonctio-
nalits dj implmentes par la classe parente.
Matlab supporte lhritage multiple, il faut utiliser le caractre & :
1 c l a s s d e f C l a s s e F i l l e < ClasseMere & C l a s s e P e r e

Par contre, il faut prendre quelques prcautions pour la gestion des conflits (par exemple,
si les deux classes parentes implmentent une mme mthode, laquelle faut-il appeler...).

6.1.2. Appeler le constructeur parent


Exemple de constructeur appelant le constructeur de la classe parente :
1 methods
2 function this = C l a s s e F i l l e ( varargin )
3 % c a l l s the parent c o n s t r u c t o r
4 t h i s = this@ClasseMere ( v a r a r g i n { : } ) ;
5 end % c o n s t r u c t o r
6 end % methods

Cet exemple est minimaliste, lide est de pouvoir rajouter un traitement spcifique des en-
tres avant ou aprs lappel au constructeur. Pour lhritage multiple, on appelle les construc-
teurs parents successivement.
1 methods
2 function this = C l a s s e F i l l e ( varargin )
3 % c a l l s the parent c o n s t r u c t o r
4 t h i s = this@ClasseMere ( ) ; % s a n s argument
5 t h i s = t h i s @ C l a s s e P e r e ( v a r a r g i n { 1 } ) ; % avec argument
6 end % c o n s t r u c t o r
7 end % methods

Pour une classe parente situe dans un package, il faut ajouter le nom du package. Ex :

25
6 Hritage de classe

1 t h i s = this@lePackage.ClasseMere ( varargin { : } ) ;

Il faudrait vrifier si le constructeur vide de la classe parente est appel par dfaut ? A
priori oui...

6.1.3. Appeler la mthode parente


Lappel une mthode de la classe parente suit la mme logique que pour le constructeur :
1 c l a s s d e f C l a s s e F i l l e < ClasseMere
2 methods
3 f u n c t i o n uneMethode ( o b j )
4 % . . . pretraitements
5 uneMethode@ClasseMere ( o b j ) ; % A p p e l l e l a methode de l a c l a s s e p a r e n t e
6 % . . . post - t r a i t e m e n t s
7 end
8 end
9 end

6.2. Acher les objets


Pour grer la manire dont les objets peuvent tre affichs, on peut surcharger les m-
thodes disp et display :
disp affiche un rsum de lobjet, sutilise de manire explicite (en tapant disp obj ou
disp(obj) )
display fonction daffichage, qui fait le plus souvent appel disp, et qui est appele quand
le nom de lobjet termine une ligne de commande non termine par un point-virgule.
char le comportement par dfaut de cette mthode est de convertir un objet en un tableau
de caractres. Cela peut tre utilis par les fonctions daffichage.
Si on tape une ligne de commande contenant uniquement le nom dun objet, on a ainsi une
chane dappel : display->disp->char

6.3. Surcharger les oprateurs mathmatiques


Quand une classe a pour vocation de reprsenter des donnes calculables (par exemple, un
vecteur mathmatique, un quaternion...), on peut pouvoir utiliser des oprations arithm-
tiques classiques de manire naturelle. Cela est possible en surchargeant certaines fonctions.
Les fonctions mathmatiques classiques (additions, multiplication...) peuvent tre surchar-
ges en suivant le tableau 6.1. Les fonctions se prsentent souvent sous deux formes, lune
oprant sur le tableau global (nom de fonction prfix par un m ), lautre sur les lments
du tableau (pour les oprateur prfixs par un point).
Il est aussi possible de surcharger des fonctions plus complexes, comme le logarithme ou
lexponentielle (voir le tableau 6.2). On peut aussi surcharger les fonctions trigonomtriques,
qui sont relativement nombreuses...
La manipulation des tableaux binaires se fait grce aux fonctions donnes dans les tableaux
6.3 et 6.4.

tutoProgMatlab.lyx page 26 sur 45


6.4 Surcharger subsref et subsasgn

oprateur fonction matlab note


a .\ b ldivide.m
a-b minus.m
a\b mldivide.m
a^b mpower.m
a/b mrdivide.m
a*b mtimes.m
a+b plus.m
a .^ b power.m
a ./ b rdivide.m
a .* b times.m
-a uminus.m oprateur unaire
+a uplus.m oprateur unaire

TABLE 6.1. Surcharge des oprateurs arithmtiques.

fonction matlab note


sqrt
nthroot
exp
log logarithme naturel
log2 logarithme binaire
log10 logarithme dcimal

TABLE 6.2. Surcharge de quelques fonctions mathmatiques classiques.

6.4. Surcharger subsref et subsasgn


Il est possible sous Matlab de modifier et ajuster le comportement des oprateurs din-
dexation comme les parenthses et le point. Cela peut amliorer la facilit dutilisation, mais
cela requiert un peu de technicit.
Les quelques mthodes modifier sont les suivantes :
subsref permet de spcifier le retour des appels du type monObjet(3, 3) ou monObjet.truc
subsasgn permet de spcifier le retour des appels du type monObjet(3, 3)=2 ou monOb-
jet.truc = demo.
end permet de changer la manire dont les indices sont calculs dans un tableau (ex :
monObjet( :, 4 :end))
subsindex permet dutiliser un objet comme un index. Ex : res = obj1(obj2).
numel renvoie le nombre dlments dans un tableau.
size pour avoir la taille de lobjet ou du tableau dobjets
length renvoie la taille selon la plus grande dimension

tutoProgMatlab.lyx page 27 sur 45


6 Hritage de classe

oprateur fonction matlab note


a == b eq.m
a >= b ge.m
a>b gt.m
a <= b le.m
a<b lt.m
a ~= b ne.m

TABLE 6.3. Surcharge des oprateurs de comparaison. Ils fournissent un rsultat binaire.

oprateur fonction matlab note


a&b and.m
~a not.m oprateur unaire
a|b or.m
xor.m pas de symbole

TABLE 6.4. Surcharge des oprateurs logiques. Ils travaillent sur des arguments binaires.

6.4.1. Modier la lecture des donnes


Quelques ides de ce quil serait bien davoir pour des tableaux dobjets. On considre une
classe Point avec deux champs x et y, et un tableau de points de 2 lignes et 3 colonnes.
1 o b j 1 = P o i n t (10 , 1) ;
2 o b j 2 = P o i n t (20 , 1) ;
3 o b j 3 = P o i n t (30 , 1) ;
4 o b j 4 = P o i n t (10 , 2) ;
5 o b j 5 = P o i n t (20 , 2) ;
6 o b j 6 = P o i n t (30 , 2) ;
7 a r r a y = [ o b j 1 o b j 2 o b j 3 ; o b j 4 obj5 obj6 ] ;

array(1, 1) renvoie obj1


array(2 :3, 1 :2) renvoie un sous-tableau de mme classe
obj1.x renvoie 10
array(1, 1).x renvoie 10
array.x renvoie un tableau [10 20 30 ;10 20 30]

6.4.2. Modier les donnes


utiliser :
1 a r r a y ( 2 , 3) = p2 ; % a l l o c a t i o n simple
2 a r r a y ( 2 , 3) . x = 4 ; % a l l o c a t i o n de donnees
3 a r r a y (23 , 12) = p24 ; % c o p i e d un p o i n t

tutoProgMatlab.lyx page 28 sur 45


6.5 Surcharge des oprations de tableau

6.4.3. Utiliser subsindex


Cette mthode permet dutiliser un objet comme un index. Ex :
1 r e s = obj1 ( obj2 ) ;

La mthode accepte un seul argument : lobjet servant dindex. Elle renvoie un ensemble
dindices compris entre 0 et numel(obj)-1.

6.5. Surcharge des oprations de tableau


La plupart de ces fonctions concernent principalement les tableaux dfinis par deux coor-
donnes. Les fonctions qui se traduisent par des surcharges doprateurs sont listes dans le
tableau 6.5.
Mthodes de concatnation :
vertcat concatnation verticale
horzcat concatnation horizontale
cat concatnation selon une dimension arbitraire
repmat rplique un tableau pour faire une mosaque
kron une autre manire de rpter des tableaux
oprateur fonction matlab note
a ctranspose.m
[a b] horzcat.m
a. transpose.m
[a ; b] vertcat.m
a :b colon.m

TABLE 6.5. Surcharge des oprateurs manipulant la forme des tableaux des objets

Si cela a un sens pour les objets manipuls, on a aussi des fonctions permettant de changer
la taille des objets
permute permute les dimensions du tableau
reshape r-organise les lments du tableau pour avoir une nouvelle taille de tableau
ipdim retourne selon une direction spcifique
iplr retourne de droite gauche
ipud retourne de haut en bas
rot90 rotation par 90 degrs
transpose retournement par rapport la diagonale
ctranspose le mme...
sort renvoie une version trie de lobjet

tutoProgMatlab.lyx page 29 sur 45


6 Hritage de classe

6.6. Mthodes et classes abstraites


6.6.1. Mthode abstraite
On peut dclarer des mthodes comme abstraites. Les mthodes ne sont pas implmentes
par la classe, mais seront implmentes par les sous-classes. Lintrt est de manipuler les
diffrentes classes concrtes travers les mthodes dclares dans les classes parentes, sans
se soucier des dtails dimplmentation.
1 c l a s s d e f Group
2 % La c l a s s e Group d c l a r e deux mthodes ' add ' e t ' times '
3 % Une c l a s s e h r i t a n t de Group devra l e s implmenter t o u t e s
4 % l e s deux avant de p o u v o i r t r e i n s t a n c i e
5 methods ( A b s t r a c t )
6 r e s u l t = add ( g1 , g2 )
7 r e s u l t = t i m e s ( group , k )
8 end
9 end

6.6.2. Classe abstraite et interface


Une classe est dite abstraite si elle comporte des mthodes abstraites. Une classe abstraite
ne peut pas tre instancie (on ne peut pas crer dobjet de cette classe).
Matlab ne permet apparemment pas de dclarer comme abstraite une classe qui ne contient
pas de mthode abstraite.
Si une classe ne contient que des classes abstraites, on lappelle une interface.

6.6.3. Mthode scelle


Il est possible de dclarer une mthode comme scelle (sealed). Une telle mthode ne
pourra pas tre redfinie par une classe drive.
1 c l a s s d e f sealedDemo
2 methods ( S e a l e d )
3 f u n c t i o n r e s = sealedMethod ( t h i s , v a l u e )
4 res = t h i s . v a l u e + value ;
5 end
6 end
7 end

tutoProgMatlab.lyx page 30 sur 45


7. Bonnes pratiques en programmation
oriente objet
Jessaie de noter ici ce que je considre comme des bonnes pratiques de programmation
objet sous Matlab.

7.1. Conventions de nommage


Jutilise globalement les conventions de nommage java.
classes la premire lettre en majuscule. Exemple : NomDeClasse
mthodes la premire lettre en minuscule. Exemple : nomDeMethode
membres pas de prfixe, mais jvite dutiliser des noms de fonctions matlab pour viter
les conflits. Dans le corps des fonctions, je rfrence systmatiquement les champs par
this.nomDuChamp .

7.2. Construction des objets


7.2.1. Constructeurs
Il faut toujours prvoir un constructeur vide : dans le cas o on dclare un tableau dobjets,
le constructeur vide est appel automatiquement.
De plus, il est prfrable davoir systmatiquement un constructeur de copie, qui quivaut
cloner les variables membres.

7.2.2. Constructeurs statiques


Les constructeurs statiques offrent une alternative intressante lappel direct des construc-
teurs. Ils consistent dclarer dans la classe une ou plusieurs mthodes statiques qui re-
trournent une instance de la classe.
On leur trouve plusieurs avantages :
il est possible de donner un nom plus explicite pour la mthode (par exemple, une
classe Point peut proposer les mthodes createCartesian ou createPolar, selon linter-
prtation que lon veut faire des arguments)
on peut renvoyer une instance dune classe drive la place de la classe appelante.
Cela permet de renvoyer un objet bien adapt aux arguments dentre, et facilite les
volutions ultrieures des objets.

31
7 Bonnes pratiques en programmation oriente objet

En particulier sous Matlab, il est mme possible de dclarer des classes totalement abstraites
(des interfaces), mais qui proposent des fabriques statiques. Les fabriques statiques renvoient
(en gnral) une instance dune implmentation particulire de linterface.

7.3. Grer des tableaux d'objets


7.3.1. Crations d'un tableaux d'objets
Lorsque lon itre sur plusieurs objets, il peut tre prfrable de pr-allouer la mmoire
afin dviter les redimensionnements de tableau.
1 dim = num2cell ( s i z e ( i n p u t ) ) ; % r e c u p e r e l a memoire
2 r e s u l t ( dim { : } ) = NomDeLaClasse ( ) ; % a l l o u e un t a b l e a u , a p p e l l e l e c o n s t r u c t e u r v i d e
3 f o r i =1: l e n g t h ( i n p u t ( : ) ) % b o u c l e pour c r e r chaque o b j e t
4 % t r a i t e m e n t s u r chaque o b j e t
5 r e s u l t ( i ) = NomDeLaClasse ( i n p u t ( i ) ) ;
6 end

Le fait de passer par un tableau de cellules pour calculer la taille permet de grer les
cas de tableaux en dimension quelconque. Remarque : il ne faut pas oublier de prvoir un
constructeur vide, qui sera appel automatiquement quand le tableau sera cr.

7.3.2. Appels de mthodes sur un tableau d'objets


Il est assez agrable davoir des fonctions vectorises , qui calculent le rsultat sur tous
les lments dun tableau sans devoir passer par une boucle. De plus, lidal est davoir en
sortie un tableau de mme taille que le tableau dentre.
Par exemple, on souhaite calculer la norme de plusieurs vecteurs stocks dans un tableau
appel vectors . On souhaite en sortie un tableau de double. Le contenu du fichier get-
Norm , stock dans le rpertoire Vector2D serait le suivant :
1 f u n c t i o n r e s = getNorm ( t h i s )
2 %GETNORM Renvoie l a norme d ' un v e c t e u r
3 dim = num2cell ( s i z e ( t h i s ) ) ; % r e c u p e r e l a memoire du t a b l e a u
4 r e s = z e r o s ( dim { : } ) ; % c r e e un t a b l e a u v i d e
5 f o r i =1: l e n g t h ( t h i s ( : ) ) % c a l c u l e l a norme de chaque v e c t e u r
6 r e s ( i ) = hypot ( t h i s ( i ) . x , t h i s ( i ) . y ) ;
7 end

Une alternative (ici plus concise) est dutiliser la fonction reshape :


1 r e s = r e s h a p e ( hypot ( [ t h i s . x ] , [ t h i s . y ] ) , s i z e ( t h i s ) ) ;

Dans les cas o le rsultat de la fonction appele sur un objet unique est un tableau, on ne
peut plus utiliser cette stratgie. Une possibilit est de renvoyer soit le tableau dans le cas
o lentre est un objet unique, soit un tableau de cellules si lentre est un tableau dobjets.

7.4. Paquetages
Depuis la version 2008a, Matlab permet aussi lutilisation de modules importables , la
Java par exemple. Le nom du rpertoire doit commencer par le caractre + .

tutoProgMatlab.lyx page 32 sur 45


7.4 Paquetages

1 +mypack
2 +mypack/ pkfonc.m % une f o n c t i o n de paquetage
3 +mypack/ @pkClass % une c l a s s e dans un paquetage

Lutilisation des classes du modules se fait soit via une directive dimportation, soit en
utilisant une syntaxe du type nomDuModule.NomDeClasse .
Exemple :
1 r e s = mypack.pkfunc ( data )

est quivalent :
1 import mypack. ;
2 r e s = pkfunc ( data )

7.4.1. Encapsulation des classes


Lutilisation des paquetages permet de faciliter la manipulation des espaces de nom. On
peut aussi placer dans des sous-modules les classes utilitaires, qui ne seront ainsi pas visibles
par lutilisateur sans tre explicitement importes.

7.4.1.1. Exemple 1
Conidrons un package +Truc, qui contient :
un objet Truc
une fonction create
La fonction create peut tre appele de la manire suivante :
1 Truc.create ;

et renvoie un objet de classe Truc.

7.4.1.2. Exemple 2
Autre possibilit est ce crer une classe Graph, et de placer dans un rpertoire utilitaire
+GraphImpl les classes des objets VertexHandle, EdgeHandle... La classe principale Graph
importe faon les classes ncessaires, mais lutilisateur final na pas se proccuper du
contenu de +GraphImpl, et ne le voit mme pas dans le chemin courant.

tutoProgMatlab.lyx page 33 sur 45


Troisime partie .
Concepts avancs

34
8. Interfaces graphiques
Matlab permet de dvelopper des interfaces graphiques relativement conviviales, ce qui
permet de faciliter la diffusion des outils. Par contre le dveloppement est un peu plus tech-
niques quavec certains autres langages.

8.1. Concevoir ses interfaces


On peut dvelopper ses interfaces la main, cest--dire en positionnant chaque composant
individuellement, ou bien saider doutils exterieurs, tels que Guide, ou des gestionnaires de
mise en page (layout managers).

8.1.1. Conception manuelle


Une mthode pour concevoir ses interfaces graphiques est de les programmer soi-mme
la main. Long et vite fastidieux, mais on sait ce que lon fait.

8.1.2. Utilitaire  Guide 


Loutil Guide est un environnement de conception dinterfaces utilisateur graphiques. Il
permet de gnrer trs rapidement de petites interfaces graphiques. Par contre le code gnr
devient trs vite difficile maintenir.

8.1.3. Utilisation de  layouts 


Possibilit de grer des layouts la java . Le gros avantage est que cela permet de mixer
des composants redimensionnables et des composants de taille fixe, ce qui donne un aspect
plus fini aux interfaces.

8.2. Les composants


8.2.1. Composants de fentre
On dipose de plusieurs types dobjets graphiques :
gure cest le conteneur principal, qui va encapsuler les autres objets graphiques
uicontrol composant de base pour la plupart des widgets : boutons, botes cocher, bou-
tons radio, botes de texte, labels, sliders, listes...
axes objet graphique qui contient les graphes et / ou les images
uipanel permet dencapsuler des widgets, et dajouter un peu de dcorations

35
8 Interfaces graphiques

uibuttongroup utilitaire qui permet de grouper les boutons radios pour nen avoir quun
seul de slectionn
uitable permet dafficher un tableau de donnes.
On peut aussi trouver sur internet la manire dafficher une arborescence (composant ui-
tree).
Quelques attributs de composants :
TooltipString petite bulle daide qui saffiche lorsque le curseur de la souris passe par
dessus le composant

8.2.2. Menus
On peut aussi crer ses menus et barres doutils.
uimenu pour gnrer la barre de menus dune fentre
uicontextmenu il sagit dun menu flottant , typiquement aprs un clic droit
8.2.3. Barre d'outils
Les fentres ont par dfaut une barre doutils prdfinie. On peut la supprimer, ou dfinir
la sienne.
uitoolbar permet de crer sa propre barre doutils
uipushtool ajouter un bouton dans une barre doutils
uitoggletool ajoute un bouton deux tats dans une barre doutils
8.2.4. Botes de dialogue pr-dnies
On dispose dun grand nombre de botes de dialogue prtes lemploi :
message derreur, davertissement ou dinformation
lire ou sauver un fichier
fentre affichant un menu

8.3. vnements graphiques (callbacks)


Les callback sont les portions de code qui seront excutes lors de lactivation de lobjet
(appui sur le bouton, slection du menu...). Il sagit le plus souvent dun pointeur de fonction.

8.3.1. Callback dans un objet


En utilisant la programmation oriente objet, on peut dfinir le callback sur une mthode
de lobjet. Cest assez pratique, car cela permet de stocker les donnes dans la classe, et
dviter de jongler entre les UserData des diffrents objets graphiques.

tutoProgMatlab.lyx page 36 sur 45


8.4 vnements fentre

8.3.2. Partager une fonction callback entre plusieurs objets


On peut se trouver dans le cas o plusieurs objets graphiques ont des actions trs simi-
laires. Dans ce cas on peut vouloir partager la fonction callback entre les menus. Pour
diffrencier les menus, on peut spcifier des UserData diffrents. Exemple de dclaration
de deux menus :
1 uimenu ( menuTransform , . . .
2 ' Label ' , ' Rotate Y L e f t ' , . . .
3 ' UserData ' , [2 1 ] , . . .
4 ' C a l l b a c k ' , @this.onRotateImage ) ;
5 uimenu ( menuTransform , . . .
6 ' Label ' , ' Rotate Y Right ' , . . .
7 ' UserData ' , [2 - 1 ] , . . .
8 ' C a l l b a c k ' , @this.onRotateImage ) ;

Dans le corps de la classe, on dfinti la fonction de callBack onRotateImage :


1 f u n c t i o n onRotateImage ( t h i s , hObject , e v e n t d a t a )
2 data = g e t ( hObject , ' UserData ' ) ;
3 t h i s . r o t a t e I m a g e ( data ( 1 ) , data ( 2 ) ) ;
4 end

8.4. vnements fentre


Quelques pointeurs de fonctions que lon peut renseigner pour les objets de type fentre :
CreateFcn appel quand le fentre souvre. Vide par dfaut. Si on linitialise aprs que
la fentre est cre, cela na pas deffet.
DeleteFcn appel quand la fentre se ferme. Vide par dfaut.
CloseRequestFcn appel quand on demande fermer la fentre. Par dfaut, il sagit
dune fonction closereq . Possibilit de surcharger, par exemple pour demander confir-
mation de la fermeture, vrifier que le document est sauv...
ResizeFcn appel quand on redimensionne la fentre la souris. Vide par dfaut.
On trouve aussi des fonctions pour la gestion de la souris et du clavier.

8.5. Gestion de la souris


8.5.1. Clic souris
On intercepte les clics de la souris en renseignant lattribut ButtonDownFcn de lobjet
graphique considr. On applique pour cela le principe des pointeurs de fonction (function
handle). On utilise en gnral un objet de type axis ou image.
ButtonDownFcn (objet graphique) appele quand le bouton est enfonc
Attention : quand on utilise ButtonDownFcn sur un objet de type axes, lutilisation de fonc-
tions telles que plot peut re-initialiser le callback. Il vaut donc mieux spcifier cette proprit
sur un objet autre que axes (button, image...), qui lui ne sera pas affect.

tutoProgMatlab.lyx page 37 sur 45


8 Interfaces graphiques

Pour savoir si le clic sest fait avec le bouton droit, ou si les touches CTRL ou SHIFT ont t
utilises, il faut passer par la proprit SelectionType de la fentre courante. Les valeurs
de cette proprit sont :
Normal un clic gauche
Extend clic gauche avec la touche shift enfonce
Alternate un clic gauche avec la touche control, ou un clic droit
Open les deux boutons en mme temps
Exemple de laide de Matlab :
1 f h _ c b = @newfig ; % C r e a t e f u n c t i o n handle f o r newfig f u n c t i o n
2 f i g u r e ( ' ButtonDownFcn ' , f h _ c b ) ;
3
4 f u n c t i o n newfig ( s r c , e v n t )
5 i f strcmp ( g e t ( s r c , ' S e l e c t i o n T y p e ' ) , ' a l t ' )
6 f i g u r e ( ' ButtonDownFcn ' , f h _ c b )
7 else
8 d i s p ( ' Use c o n t r o l - c l i c k t o c r e a t e a new f i g u r e ' )
9 end
10 end

8.5.2. Dplacement souris


Pour la gestion du mouvement, on passe par lattribut WindowButtonMotionFcn . Par
contre cet attribut nest disponible que pour des objets de type figure . Du coup il faut
stocker quelque part la rfrence de lobjet courant.
La fin de traine de la souris est intercepte par la fonction WindowButtonUpFcn , at-
tribut de lobjet figure.
Attention : les fonction de type drawnow semblent causer un appel supplmentaire aux
fonctions de type WindowButtonXXXFcn . Il faut donc en tenir compte lors de lcriture
du corps des fonctions.
WindowButtonDownFcn (figure) appele quand le bouton est enfonc
WindowButtonUpFcn (figure) appele quand le bouton est relach
WindowButtonMotionFcn (figure) appel quand la souris est dplace
8.5.3. Position du curseur
La position du curseur est obtenue en rcuprant la valeur de lattribut CurrentPoint
de lobjet axes considr. Il sagit dun tableau de 2 lignes et 3 colonnes, qui correspond aux
coordonnes des deux points 3D du dbut et de la fin du fentrage de la droite dintercep-
tion. Cest pratique pour les graphes 3D. Si le graphe est 2D, on nutilise que les valeurs
point(1,1 :2) .

8.5.4. Molette de la souris


Il est possible de grer les vnements associs la molette de dfilement de la souris. Il
faut utiliser lattribut WindowScrollWheelFcn . L aussi, ce nest disponible que pour les

tutoProgMatlab.lyx page 38 sur 45


8.5 Gestion de la souris

objets de type figure . Pour rcuprer la direction du scroll (vers le haut ou vers le bas) on
utilise la proprit VerticalScrollCount de largument eventdata, qui vaut -1 ou +1.
Exemple :
1 f u n c t i o n mouseWheelScrolled ( hObject , eventData )
2 i f e v e n t D a t a . V e r t i c a l S c r o l l C o u n t == 1
3 d i s p ( ' Wheel up ' ) ;
4 else
5 d i s p ( ' Wheel down ' ) ;
6 end
7 end

Et on ajoute le pointeur de fonction la fentre courante par :


1 s e t ( gcf , ' WindowScrollWheelFcn ' , @mouseWheelScrolled ) ;

tutoProgMatlab.lyx page 39 sur 45


9. Exceptions et gestion des erreurs
Les mcanismes base dexceptions permettent une certaine souplesse dans le traitement
des erreurs pouvant survenir lors de lexcution dun programme.

9.1. Principe des exceptions


Quand une erreur survient dans un programme, le comportement par dfaut est darrter
le fonctionnement du programme, et dafficher lerreur. Exemple :
1 >> s u r f
2 ??? E r r o r u s i n g ==> s u r f a t 50
3 Not enough i n p u t a r g u m e n t s .

Il est possible dintercepter les erreurs, ce qui permet de Lide est dencapsuler les traite-
ments gnrants des erreurs dans des blocs try .
Quand une erreur survient lors de lxecution dun programme ou dune fonction, une
exception est leve. Le traitement de la fonction sinterrompt, et lerreur est prise en charge
par un bloc catch . Si aucun bloc catch nest trouv, un message derreur est affich avec
la liste des fonctions appeles pour produire lerreur.
Exemple
1 try
2 % b l o c d ' i n s t r u c t i o n s pouvant p o s e r des problmes
3 f i d = fopen ( f i l e n a m e , ' r ' ) ;
4 d_in = f r e a d ( f i d ) ;
5 c a t c h ME
6 % b l o c d ' i n t e r c e p t i o n de l ' e x c e p t i o n
7 f p r i n t f ( ' Unable t o a c c e s s f i l e %s \n ' , f i l e n a m e ) ;
8 return ;
9 end
10 % on reprend l e programme p r i n c i p a l

Lobjet ME est une instance dun objet MException, qui contient quelques informations
pour faciliter le traitement et le debuggage.

9.2. Traiter une exception


Les informations sur le problme sont encapsules dans un objet de type MException. Cet
objet contient les champs (publics) suivants :
identier un identifiant derreur, de la forme matlab :lib :function
message le message expliquant le type derreur
stack la liste des fonctions appeles avant que lerreur ne se produise

40
9.3 Crer ses erreurs

cause une liste dexceptions, ce qui permet ventuellement dencapsuler les traitements
derreur

9.3. Crer ses erreurs


Cest en fait assez simple, il suffit dutiliser la fonction error .
Matlab prconise dutiliser un systme didentification derreurs. Cela permet en thorie de
mieux aiguiller le traitement des erreurs. Syntaxe du type : library :function :ErrorType .

tutoProgMatlab.lyx page 41 sur 45


10. Gestion des vnements
La gestion des vnements permet une grande souplesse dans la programmation. Lide
est qu un certain moment de son droulement, le programme puisse envoyer un signal
qui sera intercept par des objets qui coutent les vnements. Les couteurs vont traiter
lvnement, puis le programme principal reprendra la main.
On a ainsi trois catgories dentits :
les objets qui envoient des vnements. Typiquement, ce sont des instances de classes
assez grosses, qui stockent une liste dinstances dcouteurs, et qui diffusent les vne-
ments quand il y a lieu
les vnement eux-mmes. En Java, ce sont des objets minimalistes, avec une rfrence
lobjet appelant et ventuellement quelques donnes dtat.
les couteurs (listeners), qui traitent les vnements. Sous Java, ils implmentent des
mthodes qui prennent en entre un vnement, et qui ne renvoient rien.
Sous Matlab, la classe handle (classe de base pour les objets) propose nativement plusieurs
mthodes pour grer les vnements. Les points retenir sont :
on dfinit les vnements avec le mot-cl events
on ajoute les couteurs avec la mthode addlistener
on diffuse un vnement par la mthode notify
les vnements sont soit une instance de event.EventData , soit des sous-classes de
la classe event.EventData .
Ce chapitre prsente la dfinition des vnement et des couteurs, puis le mcanisme de
diffusion des vnements. Enfin, une proposition de classe de type Ecouteur est prsente.

10.1. Dnir un vnement


On dfinit un vnement comme pour les proprits de classe, par la directive events .
On doit juste donner lidentification de lvnement.
1 events
2 Overflow % d e f i n i t i o n de l ' evenement
3 end

Cest tout !

42
10.2 Diffuser un vnement

10.2. Diuser un vnement


On lance un appel aux fonctions couteur de la faon suivante :
1 n o t i f y ( obj , ' Overflow ' ) ;

Ou en spcifiant le type dvnement :


1 n o t i f y ( obj , ' Overflow ' , S p e c i a l E v e n t D a t a C l a s s ( v a l u e ) ) ;

Un exemple un peu plus fourni : on cre un nouvel objet avec un champ nomm prop1 ,
et on envoie un vnement si on modifie ce champ avec une valeur numrique suprieure
10.
1 c l a s s d e f DemoGestionEvent < handle
2 % Ne marche que pour des c l a s s e s d e r i v e e s de handle
3 properties
4 Prop1 = 0 ; % une p r o p r i e t e de c l a s s e
5 end
6 events
7 Overflow % i d e n t i f i c a t i o n de l ' evenement
8 end
9 methods
10 f u n c t i o n s e t . P r o p 1 ( obj , v a l u e ) % s u r c h a r g e de l a m o d i f i c a t i o n de l a p r o p r i e t e
11 orgvalue = obj.Prop1 ;
12 obj.Prop1 = value ;
13 i f ( o b j . P r o p 1 > 10)
14 % On e n v o i e un evenement p e r s o n n a l i s
15 n o t i f y ( obj , ' Overflow ' , S p e c i a l E v e n t D a t a C l a s s ( o r g v a l u e ) ) ;
16 end
17 end
18 end % f i n des methodes
19 end % f i n du c l a s s d e f

10.3. Dnir un listener


On a deux possibilits pour dfinir ses couteurs : par pointeur de fonction et par objet
spcialis.

10.3.1. Par pointeur de fonction


Lide est de fournir la classe principale un pointeur vers une fonction de traitement. La
fonction doit suivre le format suivant : le premier argument correspond lobjet qui envoie
lvnement, le deuxime argument correspond lobjet vnement proprement dit.
Un exemple est donn dans le listing suivant :
1 f u n c t i o n o v e r f l o w H a n d l e r ( e v e n t S r c , eventData )
2 d i s p ( ' The v a l u e o f prop1 i s v e r f l o w i n g ' ) ;
3 d i s p ( [ ' I t s v a l u e was : ' num2str ( e v e n t D a t a . O r g V a l u e ) ] ) ;
4 d i s p ( [ ' I t s c u r r e n t v a l u e i s : ' num2str ( e v e n t S r c . P r o p 1 ) ] )
5 end

Pour associer lvnement la classe, on utilise la mthde addlistener , laquelle on


prcise le nom de lvnement et le pointeur de fonction qui gre lvnement.

tutoProgMatlab.lyx page 43 sur 45


10 Gestion des vnements

1 a d d l i s t e n e r ( obj , ' EventName ' , C a l l b a c k F u n c t i o n ) ;

Dans lexemple courant, cela correspond au code suivant :


1 dge = DemoGestionEvent ; % o b j e t c o u t e r
2 a d d l i s t e n e r ( dge , ' Overflow ' , @overflowHandler ) ;

10.3.2. Par classe spcialise


Une alternative est de crer sa classe couteur sur mesure. Il faut dfinir une classe qui
implmente une mthode dinterception dvnements de la manire suivante :
1 methods
2 f u n c t i o n l i s t e n M y E v e n t ( t h i s , source , e v e n t )
3 % this - i n s t a n c e de l a c l a s s e c o u t e u r
4 % s o u r c e - o b j e t q u i gnre l ' vnement
5 % e v e n t - l e s donnes a s s o c i e s l ' vnement
6 ...
7 end
8 end

On peut ensuite ajouter lcouteur (cest dire le pointeur de fonction de lobjet) lobjet
qui envoie les vnements.
1 h l i s t e n e r = a d d l i s t e n e r ( eventSourceObj , ' Overflow ' , @ o b j . l i s t e n M y E v e n t )

10.4. Regrouper la gestion des vnements


Le fait dutiliser une classe pour intercepter les vnements a aussi lavantage que lon peut
dfinir des couteurs pour plusieurs vnements, et les regrouper.
Exemple pour la dfinition dune classe abstraite pour grer les vnements dune proc-
dure doptimization :
1 classdef OptimizationListener
2 methods ( A b s t r a c t )
3 o p t i m i z a t i o n S t a r t e d ( t h i s , source , e v e n t )
4 o p t i m i z a t i o n I t e r a t e d ( t h i s , source , e v e n t )
5 o p t i m i z a t i o n T e r m i n a t e d ( t h i s , source , e v e n t )
6 end

On cre ensuite une ou plusieurs classes drives qui implmentent ces 3 mthodes.
Pour un objet optimizable , on ajoute 3 vnements, et une mthode addOptimization-
Listener :
1 c l a s s d e f O p t i m i z a b l e C l a s s < handle
2 ...
3 events
4 OptimizationStarted
5 OptimizationIterated
6 OptimizationTerminated
7 end
8 ...
9 methods
10 function addOptimizationListener ( this , l i s t e n e r )

tutoProgMatlab.lyx page 44 sur 45


10.5 Personnaliser un vnement

11 addlistener ( this , ' OptimizationStarted ' , @listener.optimizationStarted ) ;


12 addlistener ( this , ' OptimizationIterated ' , @listener.optimizationIterated ) ;
13 addlistener ( this , ' OptimizationTerminated ' , @listener.optimizationTerminated ) ;
14 end
15 end

Exemple dutilisation dans un script :


1 o p t i m i z e r = NelderMeadSimplexOptimizer ( ) ;
2 l i s t e n e r = OptimizedValueDisplay ( f i g u r e (1) ) ;
3 optimizer.addOptimizationListener ( l i s t e n e r ) ;
4 o p t i m i z e r . s t a r t () ;

10.5. Personnaliser un vnement


Par dfaut, un vnement est une instance de classe event.EventData . Si on veut un
traitement plus fin, il est possible de crer une classe dvnement personnalise :
1 c l a s s d e f SpecialEventDataClass < event.EventData
2 properties
3 OrgValue = 0 ;
4 end
5 methods
6 f u n c t i o n eventData = S p e c i a l E v e n t D a t a C l a s s ( v a l u e )
7 eventData.OrgValue = value ;
8 end
9 end
10 end

Comme on le voit ici, une classe dvnement doit hriter de event.EventData .

tutoProgMatlab.lyx page 45 sur 45

Vous aimerez peut-être aussi