Académique Documents
Professionnel Documents
Culture Documents
D. Legland
29 mai 2015
Table des matires
1. Introduction 4
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
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
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.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.
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
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...
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.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.
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
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.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
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
Lutilisation des ... la fin dune ligne pourrait causer des problmes de compatibilit
pour les passages de Linux Windows ( vrifier).
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.
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 ' ) ;
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
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 ' ) ;
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 ) ;
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 ;
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.
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.
19
5 Programmation oriente objets
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.
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 .
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 )
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.
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...).
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...
TABLE 6.3. Surcharge des oprateurs de comparaison. Ils fournissent un rsultat binaire.
TABLE 6.4. Surcharge des oprateurs logiques. Ils travaillent sur des arguments binaires.
La mthode accepte un seul argument : lobjet servant dindex. Elle renvoie un ensemble
dindices compris entre 0 et numel(obj)-1.
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
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.
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.
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 + .
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.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 ;
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.
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.
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
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
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
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.
40
9.3 Crer ses erreurs
cause une liste dexceptions, ce qui permet ventuellement dencapsuler les traitements
derreur
Cest tout !
42
10.2 Diffuser un vnement
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
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 )
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 )