Apprendre MATLAB R2014a en Pratique
Apprendre MATLAB R2014a en Pratique
Édition 2015
1
Table des matières
IDE MATLAB ........................................................................................................................................3
NUMERIQUE .......................................................................................................................................7
Chapitre1 : les types ...........................................................................................................................8
Chapitre2 : les fonctions ................................................................................................................... 13
Chapitre3 : Script et fonctions ........................................................................................................... 16
Chapitre 4 : Les tableaux et les boucles itératives.............................................................................. 18
Chapitre 5 : Les opérateurs ............................................................................................................... 20
Chapitre 6 : Structures de données ................................................................................................... 22
Chapitre 7 : Les chaînes de caractères ............................................................................................... 23
Chapitre 8 : L’algèbre linéaire ........................................................................................................... 24
Chapitre 9 : Polynômes, interpolation, et statistiques de base .......................................................... 25
Chapitre 10 : Entrées et sorties ......................................................................................................... 27
Interface graphique .......................................................................................................................... 28
Chapitre 11 : Le plot .......................................................................................................................... 29
Chapitre 12 : figure ........................................................................................................................... 35
Chapitre 13 : les images .................................................................................................................... 42
Chapitre 14 : Changer le pointer de la souris une figure .................................................................... 44
IHM .................................................................................................................................................. 45
Chapitre 15 : les bases ...................................................................................................................... 46
Chapitre 16 : Approfondissement ..................................................................................................... 48
Chapitre 17 : Poignées graphiques .................................................................................................... 52
Chapitre 18 : 1er exemple à la main ................................................................................................... 53
Chapitre 19 : Guide ........................................................................................................................... 61
Chapitre 20: Questions sur GUI ......................................................................................................... 62
Chapitre 21 : Différentes fonctions utiles pour GUI ........................................................................... 78
Chapitre 22 : Compléments............................................................................................................... 81
Chapitre 23: Exemple de guide.......................................................................................................... 86
Projet IHM avec GUIDE ..................................................................................................................... 93
Signal analyse: .................................................................................................................................. 94
Interface Image............................................................................................................................... 100
Calculatrice ..................................................................................................................................... 112
2
IDE MATLAB
3
Voici l’interface graphique de Matlab :
Cette nouvelle version est basée sur les onglets comme une grande partie des logiciels sur
Windows.
L’onglet « Home » : sont les tâches courantes pour gérer les variables, les scripts, les
importations de données, les figures, aides
L’onglet « Plots » : sont les types de figures
4
L’onglet « Apps » : sont les éléments de simulink1
Puis l’IDE :
2
4
1
Description :
(1) : Sont la liste des fichiers du répertoire courant (3) pour compiler
(2) : le terminal ou le prompt selon les personnes
(3) : le chemin courant
(4) Les variables
1
Simulink est basé sur Matlab pour gérer des éléments automatismes.
5
o 1er Activité : ouvrir editeur matlab
>> help
Résultat :
matlabhdlcoder\matlabhdlcoder - (No table of contents file)
matlab\testframework - (No table of contents file)
matlabxl\matlabxl - MATLAB Builder EX
matlab\demos - Examples.
matlab\graph2d - Two dimensional graphs.
matlab\graph3d - Three dimensional graphs.
2ème solution allez sur “Help”
Vous devez avoir comme résultat :
6
NUMERIQUE
7
Chapitre1 : les types
a) Nombres réels :
La commande : format
b) Nombres complexes :
Pour définir un complexe, on peut utiliser la commande complex(x,y) qui est égale à z=x+iy avec i²=-1
abs(z)
angle(z) : argument
8
90
5
120 60
4
3
150 30
2
180 0
210 330
240 300
270
On peut extraire la partie réelle d’un nombre complexe z avec la commande real(z) et sa partie
imaginaire avec imag(z). Enfin, le complexe conjugué ̅𝑧 = 𝑥 − 𝑖𝑦. Ce fait conj(z).
c) Matrices :
>> A = [1 2 3; 4 5 6; 7 8 9]
A=
1 2 3
4 5 6
7 8 9
Remarques :
Sensible à la casse (a≠A)
[] création : création
Espace ou , :changement de colonne
; ou Entrée : changement de ligne
>>A = [ 1 2 3
456
789]
Ou A = [1 2 3 ; 4 5 6 ; 7 8 9]
9
Ligne 2 et colonne 1 ce qui nous donne comme résultat 4.
Opérations
- Additions :
>> A=[1 2 3; 4 5 6];
>> B=[7 8 9; 10 11 12];
>>A+B
ans =
8 10 12
14 16 18
- Soustractions :
>> A-B
ans =
-6 -6 -6
-6 -6 -6
- Multiplications :
>>C=[13 14; 15 16; 17 18];
>>A*C
ans =
94 100
229 244
Inversion de la matrice
>> inv(A)
Déterminant de la matrice
>> det(A)
Diagonalisation
>>diag(A)
tril(A) et triu(A) permettent d’extraire les parties triangulaires supérieure et inférieure d’une matrice
A de dimension n.
10
d) Vecteurs :
On appelle vecteur :
>> V = [3 1]
>> v(1)
ans = 3
>> 1 :5
ans = 1 2 3 4 5
>> 1 :2 :10
ans = 1 3 5 7 9
>> 2 :-1 :1
ans : 2 1
On met ‘ au vecteur.
Produit scalaire
dot(v,w)
ex : A = [4 -1 2];
B = [2 -2 -1];
>> C = dot(A,B)
C=
>> norm(v)
Formule :
𝑛
Le produit vectoriel :
>> cross(v,w)
ones(n,1)
11
ex :
>> ones(2,1)
ans =
1
1
u = cos(x).*y;
v = sin(x).*y;
figure
quiver(x,y,u,v)
a) Données manquantes :
12
Chapitre2 : les fonctions
1) Fonctions réelles
La commande fplot(fun,lims) trace le graphe de la fonction fun sur l’intervalle ]lims(1), lims(2)[.
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
-5 -4 -3 -2 -1 0 1 2 3 4 5
Où
tol indique la tolérance souhaitée et le paramètre n (>=1) assure que la function sera tracée avec un
minimum de n+1 points.
LineSpec spécifie le type de ligne ou la couleur (par exemple, LineSpec=’-‘ pour une ligne en traits
discontinus, LineSpec=’r- -‘, une ligne rouge en traits mixtes, etc.).
>> fun=inline(’1/(1+x^2)’,’x’);
ou
>> fun=@(x)[1/(1+x^2)];
Ou
13
function y=fun(x)
y=1/(1+x^2);
end
2) Les zéros
Pour calculer un zéro d’une fonction fun au voisinage d’une valeur donnée x0, réelle ou complexe.
fzero(fun,[x0 x1]),
3) La fonction find
Dans sa version la plus simple : retourne un vecteur colonne d’indices des éléments qui satisfont une
condition logique.
14
4 100 100 1
>> A(find(A > 8)) = 100; % version courte
>> A(A > 8) = 100; % encore plus courte
Version lignes x colonnes : retourne deux vecteur colonnes d’indices (les indices lignes et colonnes)
des éléments qui satisfont une condition logique
4) Les polynômes
Les polynômes sont des fonctions très particulières auxquellesMATLAB dédie la toolbox polyfun. La
commande polyval, permet d’évaluer un polyval polynôme en un ou plusieurs points. Ses arguments
en entrée sont un vecteur p et un vecteur x, où les composantes de p sont les coefficients du polynôme
rangés en ordre des degrés décroissants, de an à a0, et les composantes de x sont les points où le
polynôme est évalué. Le résultat peut être stocké dans un vecteur y en écrivant :
>> y = polyval(p,x)
5) Autres fonctions
Plein d’autres fonctions existes sur Matlab. Voir annexe de ce document avec la liste des fonctions.
15
Chapitre3 : Script et fonctions
MATLAB est un interpréteur, c’est-à-dire qu’une fois le logiciel démarré, l’écran présente une invite
‘ »’ à l’utilisateur qui peut entrer une commande que MATLAB « interprète » et exécute dès sa
terminaison signalée par l’appui sur la touche <entrée>.
Cependant il est souvent intéressant de conserver des suites de commandes pour pourvoir les faire
exécuter, simplement en tapant un nom qui leur sera associé.
Le mécanisme proposé par MATLAB autorisant ce procédé est l’écriture à l’aide d’un éditeur ASCII de
la suite des commandes et de la sauver sous un nom de fichier d’extension .m.
On appelle fonction une suite d’énoncés portant un nom et pouvant présenter une ou plusieurs
valeurs résultantes.
La définition du nom est ma « déclaration de fonction » et doit être placée, comme les scripts, dans
des fichiers séparés d’extension .m. L’utilisation de la fonction dans le cours du programme est
« l’appel de fonction ».
Ex :
if nargin ~=3
else
x1 = [] ;
x2 = [] ;
if a == 0
[x1,nb] = equ1(b,c) ;
else
delta = b.*b-4.*a.*c;
if delta >=0
delta = sqrt(delta);
x1 = (-b-delta)./(2.*a);
x2 = (-b+delta)./(2.*a);
nb =2;
else
16
nb =0;
end;
end;
end
3.1) Paramètres
Un paramètre d’entrée d’une fonction est semblable à une variable locale de cette fonction ; si le
paramètre effectif est une variable du programme, la valeur de cette variable à la sortie de la fonction
sera inchangée par rapport à celle qu’elle possédait auparavant et ceci quel que soit le traitement subi
par le paramètre dans le corps de la fonction. De plus le paramètre effectif peut être une constante ou
une expression.
Un paramètre de sortie d’une fonction est semblable à une variable utilisée au niveau appelant cette
fonction, le paramètre effectif est obligatoirement une variable du programme ou un paramètre connu
dans le bloc appelant, et toute modification du paramètre formel dans le corps de la fonction sera
répercutée à la sortie sur le paramètre réel.
Une fonction MATLAB peut utiliser un nombre variable de paramètres d’entrée et de sortie.
Les deux fonctions nargin et nargout permettent de savoir le nombre des paramètres passés à une
fonction.
Un objet global en MATLAB est un objet, qui sans être un paramètre de quelque fonction que ce soit,
est partagé par un ensemble de fonctions et/ou de scripts.
Un tel objet doit être déclaré à l’aide d’une directive global dans chaque fonction ou script où l’on
désire l’utiliser. Il est inconnu partout ailleurs.
Un objet local est un objet qui est défini dans une fonction, il est connu partout à l’intérieur de cette
fonction à partir de sa première occurrence, l’espace mémoire qu’il occupe est libéré dès l’achèvement
du code de la fonction.
17
Chapitre 4 : Les tableaux et les boucles itératives
Le constructeur
La virgule ou le blanc séparant les éléments d’une même ligne, le point-virgule ou le retour chariot
séparant les lignes.
L’opérateur
x = [1 2 3 4 5]
a = [1 2 3 ; 4 5 6 ; 7 8 9] ;
Matrice spéciales
Certaines fonctions prédéfinies permettent de construire des matrices spéciales souvent utilisées :
A =zeros(n) matrice n x n
A = zeros(n,m) matrice n x m
18
Remplissages réguliers
Les fonctions linspace, logspace et meshgrid sont également utiles pour créer des vecteurs ou matrices
réalisant des remplissages discrets.
meshgrid est une aide efficace au tracé de surfaces : étant donné deux vecteurs de même taille x et y,
meshgrid en crée deux autres xx et yy qui sont tels que les coupés (xx(i), yy(i)) décrivent tous les couples
(x(i), y(j)).
size Dimension
length Dimension maximale
Size est une fonction qui permet de connaître la taille courante d’une matrice. En écrivant [n,m] =
size(a), on obtient le nombre de lignes et de colonnes de a. length est une fonction analogue qui
renvoie le maximum des dimensions.
A(v1,v2) ou v(v3)
3) La boucle for
La boucle for permet des itérations sur les colonnes de matrices, sa syntaxe est :
E = <exp>
[m,n] = size(e);
For j = 1:n
V = e(:,j);
End
4) La boucle while
n = 10;
f = n;
while n > 1
n = n-1;
f = f*n;
end
disp(['n! = ' num2str(f)])
19
Chapitre 5 : Les opérateurs
’ Transposée de la conjuguée
.’ Transposée
+ Plus binaire ou unaire
- Moins binaire ou unaire
* Multiplication de matrices
.* Multiplication terme à terme
^ Puissance matricielle
.^ Puissance terme à terme
\ Backslash : division matricielle gauche
/ Slash : division matricielle droite
.\ Division gauche terme à terme
./ Division droite terme à terme
== Égal
~= Différent
< Moins grand que
> Plus grand que
<= Moins grand que ou égal à
>= Plus grand que ou égal à
& Et logique
| Ou logique
~ Négation logique
xor Ou exclusif logique
3) États de variables numériques
Isreal(x) renvoie des 1 partout où x est de partie imaginaire nulle, même si x est de type chaîne
(char).
20
Isinf vrai pour des infinis
Exist
Exist(‘<nom>’) renvoie :
2 si le nom est un m-fichier sur un des chemins de recherche ou si c’est exactement le nom
d’un fichier
21
Chapitre 6 : Structures de données
Tableau de structure :
a(2).name = 'Renaud'
a=
1x2 struct array with fields:
name
Numbers
>> a(2).numbers % Remplissage par défaut à []
ans =
[]
>> a(2).numbers = rand(3,3); a %tableau ligne !!!!
a=
1x2 struct array with fields:
name
numbers
a(1,1) ={struct(‘nom’,’zorro’,’age’,72)}
ou en utilisant { }
22
Chapitre 7 : Les chaînes de caractères
1) Fonctions
2) Comparaison de chaîne
strcmp Comparaison
strcmpi Comparaison sans casse
strncmpi Comparaison nombre fixé d’éléments
strmatch Trouve les chaînes correspondantes
findstr Recherche d’une sous-chaîne
upper Conversion en majuscule
lower Conversion en minuscule
isletter Vrai si caractère alphabétique accentué ou non
isspace Vrai pour les caractères « blancs »
strrep Remplacement de chaînes
strtok Recherche le premier élément délimité
23
Chapitre 8 : L’algèbre linéaire
2) Système linéaire
4) Fonctions matricielles
24
Chapitre 9 : Polynômes, interpolation, et statistiques de base
1) Racines
2) Évaluation
polyval Évaluation
polyvalm Évaluation matricielle
polyder Évaluation des dérivées
4) Produit et quotient
5) Approximation
6) Interpolation
7) Interpolation bidimensionnelle
25
std Écart type d’un vecteur. C’est la racine carrée de la moyenne des carrés
des écarts à la moyenne
sort Tri par ordre croissant de valeur. Cette fonction peut fournir
optionnellement un tableau d’indices d’éléments dans le vecteur initial.
sum Somme des éléments
prod Produit des éléments
cumsum Sommes cumulées des éléments. Cette fonction calcule un vecteur des
sommes partielles du paramètre.
cumprod Produits cumulés des éléments. Cette fonction calcule un vecteur des
produits partiels du paramètre.
26
Chapitre 10 : Entrées et sorties
1) Fonctions élémentaire
Fermeture et ouverture
fopen Ouverture d’un fichier
fclose Fermeture d’un fichier
IO non formatées
fwrite Écriture de données binaires
fread Lecture de données binaires
IO formatées
fscanf, textread Lecture de données formatées
fprintf Écriture de données formatées
fgetl Lecture d’une ligne avec rejet du caractère de fin de ligne
fgets Lecture d’une ligne avec conservation du caractère de fin de ligne
ferror Demande du statut d’erreur d’I/O
feof Test de fin de fichier
Positionnement
fseek Mise à une position dans un fichier
ftell Demande de la position courante
frewind Remise au début de fichier (rembobinage)
27
Interface graphique
28
Chapitre 11 : Le plot
La commande de base :
plot(<vector of x-values>,<vector of y-values>,<style-option string>)
Exemple :
v1=[1, 3, 4, 6, 5, 2];
v2=[1, 2, 2, 3, 4, 2];
plot(v1,v2,'-o');
axis([0 7 0 5]);
La fonction :
29
Graphes spécifiques et annotations
polar Coordonnées polaires
bar Barres
stem Traits verticaux surmontés d’un petit cercle en chaque donnée
stairs Marches d’escalier
errorbar Barre d’erreur
hist Histogramme
rose Histogramme angulaire
feather Plumes…
comet Trajectoire de comète le long des données (animation)
fplot C’est la version système de funplot.
Tracés de fonction 3D
contour Tracé de contours
contour3 Lignes de niveau 3D
clabel Cotes d’élévation des lignes de niveau
pcolor Tracé par pseudo-couleurs (en échiquier)
quiver Tracé « quiver »
Surfaces et volumes
mesh Surface définie par une grille 3D
meshc mesh + contour
meshz mesh + plan zéro
surf Surface ombrée
surfc surf + contour
surfl Surface ombrée avec éclairage
waterfall Tracé en chute d’eau
Slice Visualisation volumétrique
Annotations
zlabel, xlabel, ylabel
30
Dans le même axe, on utilise hold on.
SUBPLOT
La syntaxe est la suivante:
subplot (Nbre pavés sur hauteur, Nbre pavés sur largeur, Numéro pavé)
Placement de texte
title Titre du graphe
xlabel Label de l’axe x
ylabel Label de l’axe y
zlabel Label de l’axe z
text Annotation
gtext Placement de texte à l’aide de la souris
grid Grilles
text(x,y,'string')
text(x,y,'string',propriétés)
31
Character Symbol Character Symbol Character Symbol
Sequence Sequence Sequence
32
\Im \Re \wp
\int ∫ \in \o
\wedge \times x \0
\langle \rangle
Exemple de syntaxe:
- axis([xmin xmax ymin ymax]) permet de fixer les limites des axes 2D
axis([xmin xmax ymin ymax zmin zmax]) permet de fixer les limites des
axes 3D
- axis auto
33
- axis manual gèle les axes qui restent constants indépendamment des
données qui y sont tracées, si graphe est un mode « conservation »
- axis tight règle le rapport d’aspect en sortie que toutes les unités soient
identiques dans les différentes directions
- axis fill règle les limites sur les intervalles des données
- axis ij crée des axes matriciels : i vertical vers le bas, j horizontal. axis xy
rétablit la valeur par défaut
- axis off cache les lignes, les ticks, et les labels des axes on rétablit leur
visibilité
34
Chapitre 12 : figure
Un petit exemple :
>> t = -pi:0.1:pi;
>> plot(t,y)
>> plot(0:pi/20:2*pi,sin(0:pi/20:2*pi))
35
>>text(pi,0,' \leftarrow sin(\pi)','FontSize',18, 'Color', [1 0
0],'FontName', 'arial' , 'EdgeColor','red')% EdgeColor permet de créer un
cadre ici rouge
Position and size of text. A four-element read-only vector that defines the size and position of the
text string.
[left,bottom,width,height]
If the Units property is set to data (the default), left and bottom are the x and y coordinates
of the lower left corner of the text Extent.
For all other values of Units, left and bottom are the distance from the lower left corner of
the axes position rectangle to the lower left corner of the text Extent. width and height are
the dimensions of the Extent rectangle. All measurements are in units specified by the Units
property.
Exemple :
>> plot(0:pi/20:2*pi,sin(0:pi/20:2*pi))
o FontName: Pour savoir les polices de font disponible, utiliser la commande listfonts
o FontSize : C'est la taille de la police selon le FonUnits (par défaut
10 points)
o FontWeight : light | {normal} | demi | bold
o FontUnits : {points} | normalized | inches | centimeters | pixels
o HorizontalAlignment : {left} | center | right
36
o LineStyle : {-} | -- | : | -. | none
text(3*pi/4,sin(3*pi/4),...
'\leftarrowsin(t) = .707',...
'EdgeColor','red',...
'LineWidth',2,...
'LineStyle',':');
o LineWidth : scalar(points)
Code exemple:
text(3*pi/4,sin(3*pi/4),...
'\leftarrowsin(t) = .707',...
'EdgeColor','red',...
'LineWidth',3);
37
o Margin : scalar(pixels)
Code exemple:
text(5*pi/4,sin(5*pi/4),...
['sin(5*pi/4) = ',num2str(sin(5*pi/4))],...
'HorizontalAlignment','center',...
'BackgroundColor',[.7 .9 .7],...
'Margin',10);
o Parent : handle
Text object's parent. The handle of the text object's parent object. The parent of a text object is the
axes in which it is displayed. You can move a text object to another axes by setting this property to the
handle of the new parent.
o Position : [x,y,[z]]
38
Location of text. A two- or three-element vector, [x y [z]], that specifies the location of the text in
three dimensions. If you omit the z value, it defaults to 0. All measurements are in units specified by
the Units property. Initial value is [0 0 0].
o Rotation : scalar(défaut = 0)
Text orientation. This property determines the orientation of the text string. Specify values of rotation
in degrees (positive angles cause counterclockwise rotation).
o Tag : string
User-specified object label. The Tag property provides a means to identify graphics objects with a user-
specified label. This is particularly useful when constructing interactive graphics programs that would
otherwise need to define object handles as global variables or pass them as arguments between
callback routines. You can define Tag as any string.
Units of measurement. This property specifies the units MATLAB uses to interpret the
Extent and Position properties. All units are measured from the lower left corner of the
axes plotbox.
Normalized units map the lower left corner of the rectangle defined by the axes to
(0,0) and the upper right corner to (1.0,1.0).
pixels, inches, centimeters, and points are absolute units (1 point = 1/72 inch).
data refers to the data units of the parent axes.
Vertical alignment of text. This property specifies the vertical justification of the text string. It
determines where MATLAB places the string with regard to the value of the Position
property. The possible values mean
top -- Place the top of the string's Extent rectangle at the specified y-position.
cap -- Place the string so that the top of a capital letter is at the specified y-position.
middle -- Place the middle of the string at specified y-position.
baseline -- Place font baseline at the specified y-position.
bottom -- Place the bottom of the string's Extent rectangle at the specified y-position.
39
40
41
Chapitre 13 : les images
Image I/O
(1) Image standard:
Ex :
iminfo : donne les informations sur l’image, par exemple sa taille, la date de création…
o info = imfinfo(filename,fmt) avec filename : du fichier entrée de l’image, et fmt : est
l’extension
o info = imfinfo(filename) avec filename : du fichier entrée de l’image
42
Exemple :
X = dicomread(‘C:/[Link]’, 'frames',1);
dicominfo : affiche les métadonnées de DICOM
o info = dicominfo(filename) avec filename : le chemin et le nom du fichier DICOM
Exemple :
info = dicominfo('[Link]')
Image display
o image: affiche l’image
Ex:
figure
ax(1) = subplot(1,2,1);
rgb = imread('[Link]');
image(rgb); title('RGB image')
ax(2) = subplot(122);
im = mean(rgb,3);
image(im); title('Intensity Heat Map')
colormap(hot(256))
linkaxes(ax,'xy')
axis(ax,'image')
o imagesc: mise à l’échelle et affichage de l’image
Ex :
load clown
imagesc(X)
colormap(gray)
o imshow: affichage de l’image
Ex:
I = imread('[Link]');
imshow(I,[])
o subimage: Display multiple images in a single figure even if they have different
colormaps
load trees
[X2,map2] = imread('[Link]');
subplot(1,2,1), subimage(X,map)
subplot(1,2,2), subimage(X2,map2)
Outils
43
Chapitre 14 : Changer le pointer de la souris une figure
Exemple de code :
L'attribut 'pointer' peuvent être utiliser soient dans une figure ou dans un set comme set(gcf, 'Pointer',
'arrow')
Spécification Symbole
ibeam
crosshair
arrow
watch
topl
topr
botl
botr
circle
cross
fleur
left
right
top
bottom
fullcross
custom
44
IHM
45
Chapitre 15 : les bases
I) Structure d'arbre:
Un GUI se présente comme une structure arborescente (ci-dessous) composée d’objets d’interface:
racine
Figure
Autre représentation :
On utilise les objets suivants dans la suite, ce n'est pas une liste exhaustive:
46
III) Propriétés :
Chaque objet possède un ensemble de propriétés généralement programmable qui fixent l'apparence
graphique et les réactions de l'objet aux sollicitations de l'utilisateur.
Les propriétés peuvent être des chaînes de caractères, des vecteurs de valeurs numériques, spécifiés
selon le format courant:
Par exemple, Xtick = [0 : 0.2:1] ou Xgrid = 'on'. Si chaque type d'objet possède des propriétés propres,
certaines propriétés sont communes à tous les objets : un objet text a un nom (propriété Tag), une
chaîne de caractères qu'il affiche (propriété String), police de caractères FontName de taille Fontsize...
Pour retrouver la valeur d'une propriété, il faudra en spécifier le nom dans une chaîne de caractères.
L'éditeur d'interface guide ne teste pas les majuscules et les trois premières lettres suffisent pour
retrouver une propriété : on pourra taper 'str' pour la propriété 'String' par exemple.
Parmi les propriétés des objets de l’interface, les Callbacks contiennent des scripts ou des fonctions
MATLAB pour programmer les réactions de l’interface aux commandes de l’utilisateur.
Ainsi, imaginons un PushButton nommé ‘Bouton’ auquel on a associe le Callback : grid on.
Cliquer sur Bouton provoque le tracé d’une grille sur les axes de tracé courants. Le Callback
close(gcf) fermerait l’interface graphique, cla effacerait les tracés, etc …
Les objets étant créés lors de la constitution de l’interface, ou dynamiquement durant l’exécution, on
leur associe lors de la création un identificateur unique, qu’on appelle le Handler et qui permet de
les manipuler. Certains handlers sont réservés et mis à jour en permanence :
gcbo : objet
Pour retrouver activé
dans actuellement
un script à l'aide
le handler de lade
d'un objet souris
l'interface dont on connaît une propriété qui le
caractérise, on peut utiliser la fonction findobj:
47
Chapitre 16 : Approfondissement
Descriptions :
Root :
Au sommet de la hiérarchie se trouve l'objet Root. Cet objet est invisible (on peut se le représenter
comme étant la surface de l'écran de l'ordinateur). L'utilisateur n'interagit que très rarement avec cet
objet.
Objets Figure :
Les objets Figure sont les conteneurs visibles où sont disposés tous les autres objets enfants. Ces objets
sont couramment appelés "fenêtres". Plusieurs objets Figure peuvent être ouverts simultanément et
peuvent éventuellement communiquer entre eux.
48
Objets Axes :
Les objets Axes sont les zones de traçage des graphiques (2D ou 3D). Un objet Figure peut
contenir plusieurs objets Axes simultanément.
Objets UI :
Au même niveau hiérarchique que les objets Axes, on trouve les objets UI (pour User Interface).
Certains de ces objets (comme les boutons, les menus, les cases à cocher) permettent à l'utilisateur
d'interagir avec l'interface graphique grâce à la souris ou au clavier. D'autres objets (comme les
panels, les tables...) servent à la mise en forme de l'interface graphique.
49
2) Quelques fonctions utiles :
a) Attributs :
0 - root object handle (the screen)
– gco - returns the handle of the current object in the current figure
– gcbo - returns the handle of the object whose callback is currently executing
– gcbf - returns the handle of the figure that contains the object whose callback is currently
executing
– findobj(handles,’PropertyName’,PropertyValue) – return objects with specific properties
0- racine
gca : récupère l'identifiant de l'objet Axes courant
gcbf : récupère l'identifiant de l'objet Figure où se trouve l'objet graphique dont
l'action est en cours
gcbo : récupère l'identifiant de l'objet graphique dont l'action est en cours
gcf : récupère l'identifiant de l'objet Figure courant
gco : récupère l'identifiant de l'objet graphique courant
findobj(handles,’PropertyName’,PropertyValue) : récupère objet avec les
propriétés spécifiques
c) Uicontrol:
Exemple:
uicontrol('Style', 'popup',...
'String', 'jet|hsv|hot|cool|gray',...
'Position', [20 340 100 50],...
'Callback', @setmap); % Popup function handle
callback
% Implemented as a local function
50
Voici un tableau qui résume les différents constructeurs.
Les autres objets regroupent les menus, les barres d'outils... Ils sont créés à l'aide des fonctions
UIMENU, UICONTEXTMENU, UIPUSHTOOL, UITOGGLETOOL, UITOOLBAR.
51
Chapitre 17 : Poignées graphiques
52
Chapitre 18 : 1er exemple à la main
L'utilisation des variables globales : bien que ce type de variable soit excessivement simple à
utiliser, on tend toujours à proscrire leur utilisation. Leur totale visibilité constitue un risque
majeur d'erreur de programmation si l'on ne prend pas bien soin d'assurer l'unicité de leur
nom.
L'utilisation des fonctions setappdata, getappdata et findobj : cette méthode est très flexible
et très fiable si le choix du nom des variables d'application est fait judicieusement. Cette
méthode peut aussi être utilisée dans le cadre d'interfaces complexes à plusieurs fenêtres.
Dans ce cas, il est commode de stocker les variables d'application dans l'objet graphique Root
(0) pour leur assurer une visibilité totale (il faudra veiller à choisir des noms explicites dans ce
cas).
L'utilisation des fonctions guidata/guihandles : cette méthode est également très flexible et
peut être utilisée avec du code généré par le GUIDE.
L'utilisation des fonctions imbriquées (nested functions) : cette méthode est parfaitement
adaptée si le projet ne comporte qu'un seul fichier.
1) Variables globales
Le fichier GUI_VAR_GLOBALES.M montre l'utilisation des variables globales pour gérer les
variables et les identifiants des objets graphiques pendant l'exécution de l'interface graphique.
Une fois les variables définies, en utilisant le mot clé global, dans toutes les fonctions et sous-
fonctions, leur manipulation est très aisée. Elles sont constamment visibles dans toutes les
53
fonctions. Il n'y a donc pas de gestion à proprement dit. Il suffit de les utiliser simplement sans se
soucier de leur accessibilité.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function gui_var_globales
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FIN DE LA FONCTION PRINCIPALE%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%DEBUT DE LA SOUS-FONCTION RETRANCHER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function retrancher(obj,event)
54
% Définition de nCompteur et handles comme variables globales dans chaque
fonction et sous-fonction
% nCompteur : valeur courante du compteur (scalaire)
% handles : identifiants des objets graphiques (vecteur)
global nCompteur handles
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FIN DE LA SOUS-FONCTION RETRANCHER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%DEBUT DE LA SOUS-FONCTION AJOUTER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ajouter(obj,event)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FIN DE LA SOUS-FONCTION AJOUTER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%DEBUT DE LA FONCTION PRINCIPALE%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function gui_appdata_findobj
55
'callback',@retrancher,...
'tag','bouton-');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FIN DE LA FONCTION PRINCIPALE%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%DEBUT DE LA SOUS-FONCTION RETRANCHER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function retrancher(obj,event)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FIN DE LA SOUS-FONCTION RETRANCHER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%DEBUT DE LA SOUS-FONCTION AJOUTER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56
function ajouter(obj,event)
nCompteur=nCompteur+1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FIN DE LA SOUS-FONCTION AJOUTER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3. GUIDATA et GUIHANLDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%DEBUT DE LA FONCTION PRINCIPALE%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function gui_guidata_guihandles
57
'tag','bouton_ajouter');
data=guihandles(gcf);
% D'après les Tag utilisés pour les objets graphiques crées précédemment,
la structure data
% contient les champs suivant :
% [Link]
% [Link]
% data.bouton_ajouter
% data.bouton_retrancher
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FIN DE LA FONCTION PRINCIPALE%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%DEBUT DE LA SOUS-FONCTION RETRANCHER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function retrancher(obj,event)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FIN DE LA SOUS-FONCTION RETRANCHER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%DEBUT DE LA SOUS-FONCTION AJOUTER%
58
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ajouter(obj,event)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FIN DE LA SOUS-FONCTION AJOUTER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%DEBUT DE LA FONCTION PRINCIPALE%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function gui_nested_func
59
% Création de l'objet Uicontrol Pushbutton +
handles(3)=uicontrol('style','pushbutton',...
'units','normalized',...
'position',[0.3 0.1 0.1 0.05],...
'string','+',...
'callback',@ajouter,...
'tag','bouton+');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%DEBUT DE LA FONCTION IMBRIQUEE RETRANCHER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function retrancher(obj,event)
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FIN DE LA FONCTION IMBRIQUEE RETRANCHER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%DEBUT DE LA FONCTION IMBRIQUEE AJOUTER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ajouter(obj,event)
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FIN DE LA FONCTION IMBRIQUEE AJOUTER%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FIN DE LA FONCTION PRINCIPALE%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60
Chapitre 19 : Guide
Dans le terminale de Matlab, faite >> guide
61
Chapitre 20: Questions sur GUI
Handles : permettent de les repérer dans l'interface; pour envisager par exemple une modification
dynamique (grisé d'un bouton provisoirement non utilisable, changement du texte d'un bouton,
modification d'une liste de choix...)
Le paramètre fig1est le handle de la fenêtre, c'est à dire le numéro de repère de la fenêtre attribué
par Matlab à sa création. Il est possible d'appliquer des fonctions sur cette fenêtre
(redimensionnement, ajout de menus, boutons, ...) en précisant dans les fonctions le handle
Auquel elle s'applique. La fenêtre active à un instant donné a pour handle implicite gcf.
De façon générale, tout objet graphique se voit attribué un handle ; ce handle sert de référence à cet
objet dans l'application.
Il est possible de faire un get(fig1). Il est possible de lire les principales propriétés comme le titre, la
position et la dimension dans l'écran, la couleur de fond, la présence et le type de menus, le
redimensionnement…
62
La syntaxe pour lire chaque propriété est la suivante par exemple:
Pour modifier une propriété, il faut simplement faire set(fig1, 'nom_propriété' , valeur_propriété ):
La taille et la position de la fenêtre (ou d'un objet) se fixent par modification de sa propriété
ou contrôle "position", comprenant les coordonnées (Xor,Yor) du coin inférieur gauche et ses
dimensions (Xfen,Yfen):
L'ensemble des propriétés modifiable d'un objet est donné par set(handle_objet). La liste s'affiche
avec les valeurs possibles pour les différentes propriétés; les valeurs par défaut sont signalées par
des crochets {}.
delete (handle_objet)
L'insertion d'un objet dans une fenêtre se fait par la fonction "uicontrol" , dont le premier paramètre
est le handle de la figure de référence. Le deuxième paramètre précise le "style" ou type d'objet à
insérer.
text1 = uicontrol( fig1 , 'style' , 'text' , 'position' , [100,150,170,30] , 'string' , 'Bonjour' , 'fontsize' , 15 )
Toutes les propriétés de cet objet peuvent être modifiées par la commande "set". Par exemple, le
texte en lui-même ('string') étant une propriété, il peut être modifié:
63
set( text1 , 'string' , 'Au revoir' );
La fonctionnalité la plus courante est la modification de la valeur associée à l'objet (si elle existe):
pour les objets destinés à faire une saisie (case à cocher, curseur, champ de saisie, choix de liste…),
Matlab gère automatiquement la valeur associée. Cette valeur est récupérée par toute partie de
l'application par la fonction "get":
La deuxième interaction courante est une action déclenchée par le "clic" souris sur l'objet (appuyé
puis relâché): la fonction associée est décrite dans la propriété "callback" de l'objet. Cette fonction
peut être une instruction de base Matlab ou une fonction définie par l'utilisateur (stocké dans le
fichier .m).
Certains objets n'ont pas de callback (cas des figures) mais possèdent d'autres actions associées à la
souris. Leur emploi est identique au callback classique.
fig1 = figure ;
set( fig1 , 'WindowButtonDownFcn' , 'get( fig1 , ' 'CurrentPoint ' ' ) ' );
Si on désire obtenir des coordonnées dans l'espace de mesure des axes d'un graphique, plutôt qu'en
pixels de la figure, il faut faire référence aux axes (gca) dans la fonction de clic:
64
plot( 20 , 20 , ' r+ ' ) % tracé d'une croix rouge au centre
Certains objets possèdent une fonction callback et une fonction associée au clic souris (par exemple :
ButtonDownFcn)
Bouton poussoir
Lorsqu'on clique sur le bouton poussoir, il provoque l'exécution de la fonction indiquée dans le
'callback'. Cette fonction peut-être une instruction de la base Matlab ou une liste d'instruction, ce qui
évite d'écrire une multitude de petites fonctions exécutées par les callbacks.
Menus
Généralement, les menus de la fenêtre d'application ne sont pas les menus standards Un menu est
un titre complété par une liste de sous-menu. Les actions (callbacks) sont généralement lancés à
partie des sous-menus. L'ajout de menus spécifique se fait par :
Un sous-menu est un élément du menu principal, donc de l'entité père. Il est donc déclaré car le
menu du menu principal.
65
Pour enlever les menus standards de la fenêtre, il faut fixer la propriété "Menubar" à la valeur par
défaut menubar:
set(fig1,'menubar',menubar);
Ascenseur ou slider
L'ascenseur a pour objectif de fixer la valeur d'un paramètre entre deux bornes fixées. La valeur prise
par la variable est représentée par la position du curseur.
Les textes (variable affectée, valeurs...) ne sont pas définis par le slider. Il faut le compléter par des
éléments textes convenablement placés et paramétrés; leur valeur est à modifier par la callback du
slider.
Exemple:
fig1=figure;
texte1=uicontrol(fig1,'Style','text','String',0,'Position', [140,70,80,20],'BackGroundcolor','w');
66
'callback' , 'set(texte1,''String'', get(slid1 , ''value'' ))' );
Texte Editable
Text1 = uicontrol ( fig1 , 'style' , ' edit' , 'position', [100,50,150,20] , 'Max' , 1 , 'string' , '0' );
Généralement, il faut associer un texte fixe pour préciser le rôle de la fenêtre de saisie à l'utilisateur.
uicontrol ( fig1 , 'style' , ' texte' , 'position', [10,50,90,20] , 'string' , 'Valeur A' );
Liste de choix
La liste de choix ou pop-up menu permet de sélectionner une valeur parmi une liste. Généralement,
cette valeur est un texte. La valeur retournée lors du choix (paramètre 'Value') est le numéro de ligne
du choix.
choix1 = uicontrol ( gcf , 'Style' , 'popup' , 'String' , 'Pierre|Paul|Jacques' , 'Position' , [10 10 100 80] );
67
Bouton Radio
Le bouton Radio permet de fixer un paramètre binaire ( 0 ou 1), représentant souvent un choix ou
une option dans une application.
fig1 = figure ;
radio1 = uicontrol( fig1 , 'style' , 'Radio' , 'Position' , [ 30 20 130 25 ] , 'String' , ' OptionA ' );
radio2 = uicontrol( fig1 , 'style' , 'Radio' , 'Position' , [ 30 45 130 25 ] , 'String' , ' OptionB ' );
Cadre
68
Graphiques
Les graphiques se dessinent dans une partie de la fenêtre définie par la fonction 'subplot', dont les
paramètres sont différents de l'emploi classique (division de la fenêtre en sous-fenêtres de taille
égale)
Exemple :
fig1 = figure ;
69
10) Quelques propriétés des objets d'interface
WindowButtonDownFcn, WindowButtonMotionFcn
70
FontAngle ‘italic’ (text)
FontSize 16
FontWeight ‘bold’
NextPlot ‘add’
Par exemple avec l'action d'un bouton et ce label aura pour nom (Tag 2) textStatus.
On voudra appuyer sur un bouton puis afficher le texte suivant "Bouton appuyer".
Si on utilise maintenant un "Toggle Button" (donne une réponse), on souhaite afficher quand le
Toggle Button relâcher l'instruction suivante 'Toggle down) sinon 'Toggle up'.
2
étiquette
71
isDown = get(hObject,'Value');
if isDown
else
end
contents = get(hObject,'String');
selectedText = contents{get(hObject,'Value')};
colormap(selectedText)
Img = rand(16,4,3);
ou aussi
72
14) Comment créer un menu ou sous-menu?
Aller dans le Menu du GUIDE puis dans TOOLS puis Menu Editor.
On crée l'onglet File appuyer sur New Menu, puis idem pour Open puis appuyer sur la flèche de
droite du Menu Editor.
Il est possible de changer le nom du Menu appeler (Label) puis son étiquette3 (Tag).
Il est possible de mettre un raccourci, séparer les sous-menus et de mettre une action (Callback).
3
On étiquette le nom de l'action pour le Menu
73
15) Signification de hObject, eventdata et handles:
hObject— Handle of the object, e.g., the GUI component, for which the callback was triggered. For a
button group SelectionChangeFcn callback, hObject is the handle of the selected radio button or
toggle button.
eventdata — Sequences of events triggered by user actions such as table selections emitted by a
component in the form of a MATLAB struct (or an empty matrix for components that do not generate
eventdata)
handles — A MATLAB struct that contains the handles of all the objects in the GUI, and may also
contain application-defined data.
74
Cette fonction est généré automatiquement par Matlab.
[Link] = hObject;
guidata(hObject, handles)4;
function uibuttongroup1_SelectionChangeFcn(hObject,eventdata)
4
Le guidata permet de remettre à jour la structure handles.
75
switch get([Link],'Tag') % Get Tag of selected object.
case 'radiobutton1'
case 'radiobutton2'
case 'togglebutton1'
case 'togglebutton2'
otherwise
end
a1=subplot(2,1,1,'Parent',handles.uipanel1);
plot(a1,rand(1,10),'r');
a2=subplot(2,1,2,'Parent',handles.uipanel1);
plot(a2,rand(1,10),'b');
axes(a1)
plot(a1, ...)
line(x,y,z,...)
[Link] = floor(.9*[Link]);
refresh(handles.figure1);
76
[file,path] = uiputfile('animinit.m','Save file name');
mystring = get(hObject,'String');
set(hObject,'UserData',mystring)
string = get(handles.edittext1,'UserData');
77
Chapitre 21 : Différentes fonctions utiles pour GUI
Waitbars
<handle>=waitbar(0, '<message string>', 'Name', '<title>');
Pour iteration,
waitbar(progress, <handle>);
exemple :
N=500;
hwb=waitbar(0, 'Calculating ...', 'Name', 'Time marching');
for k=1:N
File dialogs
Save
save myData x y t
ou
fname='myData';
save(fname, 'y', 'yinit', 'yfinal');
Lire
ou
theFile='myData';
load(theFile);
load(theFile, 'x', 'y', 'name')
uiputFile
Ou
78
Input dialog
prompt={'Enter x_0 (m):',...
'Enter v_0 (m/s):'};
name='Initial values';
numlines=1;
defaultanswer={'0.0', '1.0'};
[Link]='on';
[Link]='tex';
caStr=inputdlg(prompt,name,numlines,defaultanswer,options);
79
Question dialog
80
Chapitre 22 : Compléments
Exemples:
get(handle, 'PropertyName')
set(handles, 'PropertyName', 'PropertyValue')
3) uigetfile:
Cette méthode permet d'ouvrir une fenêtre d'ouverture pour ouvrir un fichier.
uigetfile({'*.m';'*.mdl';'*.mat';'*.*'},'File Selector');
4) uiputfile:
81
Les syntaxes:
uiputfile
[FileName,PathName,FilterIndex] = uiputfile(FilterSpec)
[FileName,PathName,FilterIndex] = uiputfile(FilterSpec,DialogTitle)
[FileName,PathName,FilterIndex] = uiputfile(FilterSpec,DialogTitle,DefaultName)
Exemple:
5) uigetdir:
Les syntaxes:
uigetdir
directory_name = uigetdir
directory_name = uigetdir(start_path)
directory_name = uigetdir(start_path,dialog_title)
Exemple:
dname = uigetdir('C:\');
6) fullfile:
Cette méthode permet de concaténer le chemin d'un fichier et le nom du fichier avec son extension.
filename = fullfile(pathname ,filename)
filename = C:\Users\admin\Desktop\[Link]
82
7) fileparts:
Cette méthode est inverse de la commande "fullfile". Elle donne le chemin, nom et extension d'un
fichier.
[pathStr,name,extension] = fileparts('C:\myStuff\[Link]')
pathStr =
C:\myStuff
name =
myfile
extension =
.txt
8) strcmp:
isMatch =
isMatch =
9) regexp:
Syntaxe:
[selected_outputs] = regexp(string,expr,outselect).
Avec string qui la chaine de caractère, exp est l'expression régulière et outselect est option.
Exemples:
mystring = 'My name is Sarah Wait Zaranek';
splitstring = regexp(mystring,'\s','split');
disp(splitstring)
83
shortLabels = cellfun(@(label,idx) label(sort([idx idx+1])),...
locationNames,idx,'UniformOutput',false);
disp(shortLabels)
Résultat: 'BeVa' 'Bi' 'Ca' 'SaRo' '[Link]' 'Wi'
geneString = 'CC=0/CT=1/TT=5375';
doubleValues1 = regexp(geneString,'(?<=(CC|TT|AA|GG)=)\d+','match');
disp(doubleValues1)
10) varargin:
varargin =
84
85
Chapitre 23: Exemple de guide
Vous pouvez changer le chemin de l’enregistrement de l’interface sur Save on startup as.
Sur la figure 7,
un fichier .fig (non éditable) contenant les objets graphiques Figure, Axes et
Pushbutton
un fichier .m contenant le code du fonctionnement de l'interface graphique
5
Pour la suite de ce document, je prendrai Blank GUI.
86
Figure 7 : à gauche le .m et à droite le .fig
87
Menu Tab Order
Align
Editor Editor Toolbar
Objects
Editor
Run GUI
Object
Brower
Component
Palette Property
Inspector
M-file Editor
Layout Area
Resize
Box
1) Variables globales
>>guide
88
Cliquer bouton droite sur Static Text :
89
Faisait le changement suivant :
On va ensuite positionner les deux boutons – et +. Nommé ces deux boutons minus et plus.
90
Aller maintenant dans le fichier .m :
[Link] = 0;
[Link] = [Link]-1;
set([Link],'string',num2str([Link]));
guidata(hObject,handles);
91
[Link] = [Link] + 1;% sélectionne le fichier
set([Link],'string',num2str([Link]));
guidata(hObject,handles);
92
Projet IHM avec GUIDE
93
Signal analyse:
L’objectif est de faire une interface graphique pour une certaine équation donnée et d’afficher
sa transformée de Fourier et le déplacement en fonction du temps.
Indices :
Penser à l’endroit où le programme s’ouvre « OpeningFcn »
94
set(handles.edit1,'String', num2str(50))
set(handles.edit2,'String', num2str(120))
set(handles.edit3,'String', '0:0.001:0.25')
4) Aller sur votre .fig puis sur le bouton « Plot », créer la méthode de dialogue entre
fonction (clique droite puis sur View Callbacks puis Callbacks)
5) Dans cette nouvelle fonction,
Récupérer les valeurs de f1 et f2 puis les convertir en double
Récupérer la valeur temps puis convertir en entier
Indice :
Indice :
Utiliser set(nom du plot par exemple, ‘parent’, [Link] de l’objet graphique)
Utiliser plot, et grid on
95
REPONSE :
function varargout = SignalAnalysis(varargin)
% SIGNALANALYSIS M-file for [Link]
% SIGNALANALYSIS, by itself, creates a new SIGNALANALYSIS or raises
the existing
% singleton*.
%
% H = SIGNALANALYSIS returns the handle to a new SIGNALANALYSIS or the
handle to
% the existing singleton*.
%
% SIGNALANALYSIS('CALLBACK',hObject,eventData,handles,...) calls the
local
% function named CALLBACK in SIGNALANALYSIS.M with the given input
arguments.
%
% SIGNALANALYSIS('Property','Value',...) creates a new SIGNALANALYSIS
or raises the
% existing singleton*. Starting from the left, property value pairs
are
% applied to the GUI before SignalAnalysis_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property
application
% stop. All inputs are passed to SignalAnalysis_OpeningFcn via
varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
96
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to SignalAnalysis (see VARARGIN)
set(handles.edit1,'String', num2str(50))
set(handles.edit2,'String', num2str(120))
set(handles.edit3,'String', '0:0.001:0.25')
% Update handles structure
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.
function varargout = SignalAnalysis_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
97
% handles structure with handles and user data (see GUIDATA)
f1 = str2double(get(handles.edit1,'String'));
f2 = str2double(get(handles.edit2,'String'));
t = str2num(get(handles.edit3,'String') );
98
Y = fft(y);
hfft = plot(fftshift(abs(double(Y))));
grid on
set(hfft,'parent',handles.axes1);
himg = plot(t ,y );
grid on
set(himg,'parent',handles.axes2);
99
Interface Image
Nous allons effectuer un petit projet graphique pour voir la maîtrise de la GUI sous Guide de Matlab.
But : De faire une interface graphique (figure 1) pour visualiser des images dans un répertoire source
et faires avancés les images et dans une deuxième étape d’afficher des informations de cette images.
Figure 1 : L’objectif
Commençons ce TP :
Astuce : Cliquez bouton droite sur l’objet pour avoir sa propriété (property Inpector) et penser aux
boutons de faire la méthode callback.
100
Figure 2 : .fig
Vous devez avoir 2 boutons (+ et -), 1 uiPanel (Gestion Image), 2 labels, 1 fenêtre d’affichage (axes1),
1 Listbox.
Reproduisez la figure 4
101
Figure 4 : Fenêtre de Menu Editor à reproduire
[Link] = hObject;
[Link] =0; % indice à 0 pour l"incrémentation
[Link] = false;
2) Dans la fonction Ouverture_Callback(hObject, eventdata, handles),
Vous devez utilisez l’instruction suivante :
rep = uigetdir(matlabroot,'Sélectionner un répertoire d''image');
Puis créer la méthode de lecture des chemins de répertoire nommée par exemple [fS, noun] =
readdir(rep);% donne le chemin
Elle retournera cette méthode une structure de tableau fS (les chemins des images) et noun (le nom
des images).
Après écrivez cette ligne pour récupérer le nombre de fichier dans un répertoire [garb noofiles]
= size(fS);% la taille du nombre de fichier
Pour gérer l’affichage et gestion de la Listbox, voici les deux fonctions que vous allez créer.
affichage(hObject,handles)
gestionListbox(hObject,handles)
Astuce : Pensez à utiliser le mot handles pour faire des variables réutilisable dans le code et
guidata(hObject,handles).
102
button = questdlg('Ready to quit?', ...
'Exit Dialog','Yes','No','No');
switch button
case 'Yes',
disp('Exiting MATLAB');
%Save variables to [Link]
close all;
case 'No',
quit cancel;
end
4) La function readdir qui devra prendre le chemin du répertoire et ressortir une structure
des chemins+noms des fichiers et que les noms de fichiers.
Voici le code :
if dirName==0
fileSorted=[];
disp(' Empty directory ');
else
D=dir(dirName);
[nooffilesf garb]=size(D);
fileX = [];
for i=3:nooffilesf
% this assumes that the first and second are . and ..
% uncomment the if statement below if you want to select only
% filenames starting with some characters say 'im' in this example
% similarly we can have a condition to check if the files end in
% say .dcm
fileX(i-2).name = D(i).name;
end
[garb nooffiles]=size(fileX);
fileSorted=[];
fileSorted2=[];
for i=1:nooffiles
fileSorted(i).name = strcat(dirName,'\',fileX(i).name);%Path + Name
filter
fileSorted2(i).name = strcat(fileX(i).name); % Name file
end
end
103
6) Gestion du bouton plus :
Comprenez ce code et faites de même pour le bouton moins.
% --- Executes on button press in pushbuttonPlus.
function pushbuttonPlus_Callback(hObject, eventdata, handles)
% hObject handle to pushbuttonPlus (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if [Link] == true % ouverture de l'incrémentation
end
affichage(hObject, handles);
gestionListbox(hObject,handles)
end
guidata(hObject,handles);
a. Reproduisez la figure 1
Indices:
Pour la gestion de couleur de texte utiliser les deux instructions
NewInformationFile = 'Propriété du fichier';
NewColorFile = sprintf('<HTML><BODY bgcolor="green"
text="white">%s', NewInformationFile);
Une des solutions élégeantes pour afficher la date, heure et la taille du fichier passé par java
Utiliser l’instruction imfinfo
Pensez à faire une structure pour afficher l’ensemble des éléments que nous allons afficher
dans la listbox.
Puis pensez à l’instruction set
104
Réponse :
% By Dimitri PIANETA
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
105
% --- Executes just before InterfaceImage is made visible.
function InterfaceImage_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to InterfaceImage (see VARARGIN)
% --- Outputs from this function are returned to the command line.
function varargout = InterfaceImage_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%% Gestion de l'affichage
function affichage(hObject,handles)
106
Y = imread(char(handles.fS2([Link]).name));
[Link] =double(Y);
colormap('default');
himg=imshow(Y);
[Link] = himg;
axis image
[Link] = [[Link],'\',[Link]];
%disp([Link]);
set(himg,'parent',handles.axes1);
set([Link], 'String',char(handles.fS2([Link]).name));
set(handles.text2, 'String',sprintf(' %d /
%d',round([Link]),round([Link])));
guidata(hObject,handles);
%% Gestion de la listbox
function gestionListbox(hObject, handles)
NewInformationFile = 'Propriété du fichier';
NewColorFile = sprintf('<HTML><BODY bgcolor="green"
text="white">%s', NewInformationFile);
NewInformationImage = 'Information sur l''image';
NewColorFile2 = sprintf('<HTML><BODY bgcolor="green"
text="white">%s', NewInformationImage);
myFile = [Link](handles.fS2([Link]).name);
flen = length(myFile);
flenDateTime = [Link]([Link]());
% E : Day in week
% y : Year in four digits
% M: Month in year
% d : Day in month
ft = [Link]('E [Link]');
uFormat= [Link](flenDateTime);
% h : Hour in A.M/P.M
% m: Minute in hour
% a : A.M./P.M. marker
% z: Time Zone example CEST : Central European Summer Time or CET:
% Central European Time
%
ft2 = [Link]('hh:mm:ss a zzz');
uFormat2= [Link](flenDateTime);
info = imfinfo(char(handles.fS2([Link]).name));
107
s = struct('f',{NewColorFile,['Nom du
fichier:',[Link]([Link]).name ],['Date de création:',char(
uFormat) ],['Heure de création:',char( uFormat2) ],...
['Taille du
fichier:',num2str(flen),'Octets'],['Format:',[Link]], NewColorFile2,
['Hauteur:',[Link]],['Largueur:',[Link]]} );
%[Link]
handles.fS2 = fS;
[Link] = noun;
[Link] = noofiles;
[Link] = true;
[Link] = 1;
guidata(hObject,handles);
affichage(hObject,handles)
gestionListbox(hObject,handles)
%% Bouton quitter
function Quitter_Callback(hObject, eventdata, handles)
% hObject handle to Quitter (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
button = questdlg('Ready to quit?', ...
'Exit Dialog','Yes','No','No');
switch button
case 'Yes',
disp('Exiting MATLAB');
%Save variables to [Link]
close all;
case 'No',
quit cancel;
end
if dirName==0
fileSorted=[];
disp(' Empty directory ');
else
D=dir(dirName);
[nooffilesf garb]=size(D);
108
fileX = [];
for i=3:nooffilesf
% this assumes that the first and second are . and ..
% uncomment the if statement below if you want to select only
% filenames starting with some characters say 'im' in this example
% similarly we can have a condition to check if the files end in
% say .dcm
fileX(i-2).name = D(i).name;
end
[garb nooffiles]=size(fileX);
fileSorted=[];
fileSorted2=[];
for i=1:nooffiles
fileSorted(i).name = strcat(dirName,'\',fileX(i).name);%Path + Name
filter
fileSorted2(i).name = strcat(fileX(i).name); % Name file
end
end
end
affichage(hObject, handles);
gestionListbox(hObject,handles)
end
guidata(hObject,handles);
end
affichage(hObject, handles);
gestionListbox(hObject,handles)
end
109
guidata(hObject,handles);
110
111
Calculatrice
Le but ce premier TP est d'effectué une calculatrice en GUI en s'aidant avec guide de Matlab.
Avec différentes touches comme l'interface graphique de mon application:
Permet de remonter dans l'historique des opérations que nous avons effectué
Permet de descendre dans l'historique des opérations que nous avons effectué
112
Rappel mémoire
Touche "clear"
Racine carré
L'opération x au carré
Division
Multiplication
Soustraction
Addition
113
Égale
Puissance de 10
à Les chiffres de 0 à 9
Étape 0: initialisation
Faite dans le terminale guide
>> guide
114
Qui permet de choisir dans répertoire que vous allez mettre votre projet et le nom du point fig
par exemple calculatrice.
115
Puis compiler votre interface pour générer le code.
[Link] = hObject;
functiondir=getFunctionFolder();%Given choosing
set([Link], 'CData',
imread([[Link] '\' '[Link]']));
Puis la fonction que je vous donne:
function functiondir=getFunctionFolder()
functionname='calculatrice.m';
functiondir=which(functionname);
functiondir=functiondir(1:end-length(functionname));
Étape 2: Gestion des chiffres de 0 à 9 et de leurs affichages
Fin du SI
Étape 3: Les opérateurs de calculs et de leurs affichages
Fin du Si
117
Lecture des éléments de l'affichage
2. Nous devons ensuite appeler cette fonction sur toute les opérations '+', '/', '#', '-'.
3. Construction de la deuxième fonction qui va gérer les opérations spécifiques qui
sont : sqrt pour la racine carré, x², 1/x et EE.
Nous devrons pour ces opérateurs suivre la syntaxe suivante:
Pour simplifier notre calculatrice, on ne peut pas multiplier un chiffre avant l'opérateur.
sqrt : l'affichage doit-être comme suivant sqrt(valeur)
x² : l'affichage doit-être comme suivant valeur ^2
1/x : l'affichage doit-être comme suivant 1/valeur
EE : l'affichage doit-être comme suivant 10^valeur
Indices :
4. Faites ensuite le rappel cette fonction ci-dessous écrite à chaque bouton opération.
118
% handles structure with handles and user data (see GUIDATA)
if ~isempty(userExpression)
try
2
% evaluate character array that was entered by user and store as a
% number
3
answerNum = eval(userExpression);
set(handles.edit_calc_display,'string', answerStr) 5
update_history(handles, userExpression)
catch
6
%the expression was not valid, so notify the user by changing text
'ForegroundColor',[0.6,0.6,0.6], ...
'FontAngle','Italic', ...
'FontWeight','Normal') 7
pause(1.5)
set(handles.edit_calc_display,'string',userExpression, ...
119
'ForegroundColor',[0,0,0], ...
'FontAngle','Normal', ...
'FontWeight','Bold')
end
end
120
2. La fonction update_history permet de faire l'historique des opérations effectués précédents:
Recopier ce code:
curHistoryIndex = [Link];
[Link] =
vertcat([Link](1:curHistoryIndex), {userExpression});
[Link] = curHistoryIndex+1;
guidata(handles.edit_calc_display, handles);
121
%get current place in line of history
curHistoryIndex = [Link];
newExpression = [Link]{curHistoryIndex};
if ~strcmp(userExpression,newExpression)
%it doesnt match whats currently in the box, so use it
set(handles.edit_calc_display,'string', newExpression)
if curHistoryIndex > 1
end
if ~strcmp(userExpression,newExpression)
set(handles.edit_calc_display,'string', newExpression)
if curHistoryIndex > 2
end
end
122
end
%later
guidata(handles.edit_calc_display, handles)
%initialize history
[Link] = {};
[Link] = 0;
123
[Link] = '';
set(handles.text_memory,'string','')
set(handles.edit_calc_display,'string',[Link])
end
if ~isempty([Link])
set(handles.text_memory,'string','M')
end
guidata(hObject, handles);
124
Étape 7: Effacer un par un les chiffres
Sinon
Fin si
Étape 8: Gestion des touches claviers
Fin si
1. Je souhaite faire égale dans l'affichage après avoir fait par exemple cette opération
2+5 puis entrer. Vous devez créer la méthode KeyPressFcn dans la zone de l'affichage du calcul.
Votre code
end
% --- Executes on key press with focus on figure1 and none of its controls.
function figure1_KeyPressFcn(hObject, eventdata, handles)
125
% Key: name of the key that was pressed, in lower case
if strcmp(get(gcf,'CurrentKey'),'return')
end
126
Correction :
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
127
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to calculatrice (see VARARGIN)
%initialize history
[Link] = {};
[Link] = 0;
functiondir=getFunctionFolder();%Given choosing
[Link] = [functiondir '\picture\'];
% --- Outputs from this function are returned to the command line.
function varargout = calculatrice_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
128
% str2double(get(hObject,'String')) returns contents of
edit_calc_display as a double
if ~strcmp(userExpression,newExpression)
%it's different from what's in the box, so let's use it
set(handles.edit_calc_display,'string', newExpression)
if curHistoryIndex > 2
129
% change the index to reflect what is now being displayed
[Link] =
[Link] - 2;
end
end
end
end
%check to make sure we can go forward in the history list from where the
%current placeholder is
if size([Link],1) > curHistoryIndex
if ~strcmp(userExpression, newExpression)
%it doesnt match whats currently in the box, so use it
set(handles.edit_calc_display,'string',newExpression)
% change the index to reflect what is now being displayed
[Link] = [Link] +1;
guidata(handles.edit_calc_display, handles);
elseif size([Link],1) > curHistoryIndex+1
%it DOES match what's in the box, so the user probably clicked PREV
%and then clicked NEXT in which case we need to change two spaces
%in our history instead of one
130
% update display with the last entry and leave index where it is.
set(handles.edit_calc_display,'string',[Link]{curHistoryI
ndex})
end
131
function pushbutton6_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
apprend_num(handles,6);
% Gestion de l'affichage
userExpression = get(handles.edit_calc_display, 'string');
if isempty(userExpression)
set(handles.edit_calc_display,'string',[userExpression num2str(num)]);
else
if any(strcmp(userExpression(end),{'+','-','*','/'}))
% if so, add a space between the operator and the number
set(handles.edit_calc_display,'string',[userExpression ' '
num2str(num)]);
else
%otherwise just insert
set(handles.edit_calc_display,'string',[userExpression
num2str(num)]);
end
end
132
% --- Executes on button press in pushbuttonMC.
function pushbuttonMC_Callback(hObject, eventdata, handles)
% hObject handle to pushbuttonMC (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[Link] = '';
set(handles.text_memory,'string','')
133
if ~isempty(userExpression)
if strcmp(userExpression(end), ' ') && length(userExpression) > 1
%remove the trailing space and whatever comes before it
set(handles.edit_calc_display,'string',userExpression(1:end-2))
else
%simply remove the last character
set(handles.edit_calc_display,'string',userExpression(1:end-1))
end
end
134
% --- Executes on button press in pushbuttonMinus.
function pushbuttonMinus_Callback(hObject, eventdata, handles)
% hObject handle to pushbuttonMinus (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
apprend_operator(handles, '-');
apprend_operator2(handles, '10^');
if any(strcmp(operator,{'sqrt'}))
%and concatenate the operator
135
else if any(strcmp(operator(end),{'x'}))
set(handles.edit_calc_display,'string',[userExpression '^2']);
else
if any(strcmp(operator,{'1/'}))
set(handles.edit_calc_display,'string',[operator userExpression
]);
else
if any(strcmp(operator, {'10^'}))
end
end
end
136
end
end
% --- Executes on key press with focus on edit_calc_display and none of its
controls.
function edit_calc_display_KeyPressFcn(hObject, eventdata, handles)
% hObject handle to edit_calc_display (see GCBO)
% eventdata structure with the following fields (see UICONTROL)
% Key: name of the key that was pressed, in lower case
% Character: character interpretation of the key(s) that was pressed
% Modifier: name(s) of the modifier key(s) (i.e., control, shift) pressed
% handles structure with handles and user data (see GUIDATA)
% update answer (need to call function twice due to bug with keypressfcn
if strcmp(get(gcf,'CurrentKey'),'return')
pushbuttonEgal_Callback(hObject, eventdata, handles)
pause(0.01)
137
drawnow
pushbuttonEgal_Callback(hObject, eventdata, handles)
pause(0.01)
drawnow
end
% --- Executes on key press with focus on figure1 and none of its controls.
function figure1_KeyPressFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata structure with the following fields (see FIGURE)
% Key: name of the key that was pressed, in lower case
% Character: character interpretation of the key(s) that was pressed
% Modifier: name(s) of the modifier key(s) (i.e., control, shift) pressed
% handles structure with handles and user data (see GUIDATA)
if strcmp(get(gcf,'CurrentKey'),'return')
pushbuttonEgal_Callback(hObject, eventdata, handles)
end
138