|
|
Apprendre � programmer avec MATLAB
Programmer sous MATLAB
Scripts et fonctionsIl est possible d'enregistrer une s�quence d'instructions dans un fichier (appel� un M-file ) et de les faire ex�cuter par MATLAB. Un tel fichier doit obligatoirement avoir une extension de la forme .m (d'o� le nom M-file) pour �tre consid�r� par MATLAB comme un fichier d'instructions. On distingue 2 types de M-file, les fichiers de scripts et les fichiers de fonctions. Un script est un ensemble d'instructions MATLAB qui joue le r�le de programme principal. Si le script est �crit dans le fichier de nom nom.m on l'ex�cute dans la fen�tre MATLAB en tapant nom. M�me si l'on ne souhaite pas � proprement parler �crire de programme, utiliser un script est tr�s utile. Il est en effet beaucoup plus simple de modifier des instructions dans un fichier � l'aide d'un �diteur de texte que de retaper un ensemble d'instructions MATLAB dans la fen�tre de commande. Les fichiers de fonctions ont deux r�les. Ils permettent � l'utilisateur de
d�finir des fonctions qui ne figurent pas parmi les fonctions incorpor�es de MATLAB (<< built-in functions >>) et de
les utiliser de la m�me mani�re que ces derni�res (ces fonctions sont nomm�es
fonctions utilisateur).
Ils sont �galement un �l�ment important dans la programmation d'applications o�
les fonctions jouent le r�le des fonctions et proc�dures des langages de
programmation usuels. On d�finit la fonction fonc de la mani�re suivante: function [vars1, ..., varsm] = fonc(vare_1, ..., varen) s�quence d'instructions o�
Dans l'exemple qui suit, on d�finit une fonction modulo qui calcule la valeur de a modulo n en prenant pour syst�me de r�sidus {1, 2, ..., n} au lieu de {0, 1, ..., n-1} (syst�me de r�sidus consid�r� par la fonction incorpor�e mod). Les lignes qui suivent doivent �tre enregistr�es dans un fichier de nom modulo.m. function [r,q] = modulo(a,n) % Calcule la valeur de a modulo n en prenant pour systeme de residus % 1, ... , n au lieu de 0, ... , n-1. % % appel : [r,q] = modulo(a,n) % % Arguments de sortie : % r : le residu % q : le quotient q = floor(a./n); r = a - n*q; % si le reste de la division entiere vaut 0, le residu vaut par convention n if r == 0, r = n; endLes lignes pr�c�d�es du symbole % sont des lignes de commentaire. Les lignes de commentaire situ�es entre la ligne function ... et la 1-ere ligne d'instructions sont affich�es si l'on demande de l'aide sur la fonction modulo. >> help modulo Calcule la valeur de a modulo n en prenant pour systeme de residus 1, ... , n au lieu de 0, ... , n-1. appel : [r,q] = modulo(a,n) Arguments de sortie : r : le residu q : le quotient >>L'appel d'une fonction utilisateur s'effectue de la m�me fa�on que l'appel de n'importe quelle fonction MATLAB: >> b = 10 ; m = 4; >> [r,q] = modulo(b,m) r = 2 q = 2 >> modulo(10,5) ans = 5 >>
|
| == | : | �gal � (x == y) |
| > | : | strictement plus grand que (x > y) |
| < | : | strictement plus petit que (x < y) |
| >= | : | plus grand ou �gal � (x >= y) |
| <= | : | plus petit ou �gal � (x <= y) |
| ~ = | : | diff�rent de (x ~ = y) |
Les op�rateurs logiques sont:
| & | : | et (x & y) |
| | | : | ou (x | y) |
| ~ | : | non (~ x) |
Les op�rateurs de comparaison et les op�rateurs logiques sont utilis�s essentiellement dans les instructions de contr�le, voir le paragraphe 5.3.
Syntaxe :
s�quence d'instructions
end
o�
borne_inf et borne_sup sont deux constantes r�elles (appel�es param�tres de la boucle);
s�quence d'instructions est le traitement � effectuer pour les valeurs d'indices variant entre borne_inf et borne_sup avec un incr�ment de 1. On parle du corps de la boucle.
Interpr�tation :
Si borne_inf est plus petit ou �gal �borne_sup, le traitement
s�quence d'instructions est ex�cut� borne_sup - borne_inf fois, pour les valeurs de la
variable indice �gales � borne_inf,
borne_inf+1,
..., borne_sup. Si borne_inf est
strictement plus grand que borne_sup, on passe
� l'instruction qui suit imm�diatement l'instruction de fin de boucle (end).
Remarque :
L'indice de boucle ne prend pas n�cessairement des
valeurs enti�res. D'autre part il n'est pas n�cessaire que l'indice de la boucle
apparaisse dans le corps de la boucle; par contre il est interdit de modifier sa
valeur s'il appara�t. Il est possible d'imbriquer des boucles mais elles ne
doivent pas se recouvrir. On peut utiliser un incr�ment (pas) autre que 1 (valeur par d�faut). La syntaxe est
alors borne_inf : pas : borne_sup. Le pas peut
�tre n�gatif. Attention � bien g�rer la borne sup�rieure! Voici un exemple
(idiot) venant illustrer les possibilit�s de variations de l'indice de la boucle
>> for r=1.1:-0.1:0.75 disp(['r = ', num2str(r)]); end r = 1.1 r = 1 r = 0.9 r = 0.8 >>Voici un exemple d'utilisation d'une boucle pour calculer n! (le lecteur attentif sait calculer n! plus simplement ... par exemple en ex�cutant prod([1:n])).
>> n = 4; >> nfac = 1; >> for k = 1:n nfac = nfac*k; end >> nfac nfac = 24 >>
Syntaxe :
s�quence d'instructions
end
o�
Interpr�tation :
Tant que expression
logique est vraie le traitement s�quence
d'instructionsest ex�cut� sous forme d'une boucle. Lorsque expression logique devient faux, on passe �
l'instruction qui suit imm�diatement l'instruction de fin de boucle (end).
Remarque :
expression
logique est en g�n�ral le r�sultat d'un test (par exemple i < Imax) ou le r�sultat
d'une fonction logique (par exemple
all(x)). Il est imp�ratif que le traitement de la s�quence
d'instructions agisse sur le r�sultat de expression
logique sans quoi on boucle ind�finiment (-:.
Voici comment calculer n! avec une boucle while:
>> n = 4; >> k = 1; nfac = 1; >> while k <= n nfac = nfac*k; k = k+1; end >> nfac nfac = 24 >>
L'instruction conditionn�e la plus simple a la forme suivante:
Syntaxe :
s�quence d'instructions
end
o�
Interpr�tation:
la s�quence
d'instructions n'est ex�cut�e que si le r�sultat de l'�valuation de
l'expression logique est vraie (c'est-�-dire
vaut 1). Dans le cas contraire on ex�cute l'instruction qui suit le mot cl�
end. Dans le cas o�
l'expression logique est vraie, apr�s
ex�cution de la s�quence d'instructions on
reprend le programme � l'instruction qui suit le mot cl� end.
Remarque :
Contrairement � certains langages de programmation, il
n'y a pas de mot cl� << then >> dans cette
instruction conditionn�e. Notez �galement que la marque de fin de bloc
conditionn� est le mot cl� end et non
pas<< endif >>.
Il existe une s�quence conditionn�e sous forme d'alternatives:
Syntaxe :
ifexpression logique
s�quence d'instructions 1
else
s�quence d'instructions 2
end
o�
Interpr�tation :
Si expression
logique est vraie la s�quence d'instructions
1 est ex�cut�e, sinon c'est la s�quence
d'instructions 2 qui est ex�cut�e. Le d�roulement du programme
reprend ensuite � la premi�re instruction suivant le mot cl� end.
Il est bien entendu possible d'imbriquer des s�quences d'instructions
conditionn�es (au sens o� la s�quence d'instruction conditionn�e contient des
s�quences d'instructions conditionn�e). Pour une meilleure lisibilit�, il est
recommand� d'utiliser des indentations afin de mettre en �vidence l'imbrication
des s�quences d'instructions conditionn�es.
Il est possible d'effectuer un choix en cascade:
Syntaxe :
ifexpression logique 1
s�quence d'instructions 1
elseif expression logique 2
s�quence d'instructions 2
...
elseif expression logique N
s�quence d'instructions N
else
s�quence d'instructions par d�faut
end
Interpr�tation :
Si expression logique
1 est vraie la s�quence d'instructions 1
est ex�cut�e et le programme reprend ensuite � la premi�re instruction
suivant le mot cl� end, sinon si expression logique
2 est vraie la s�quence d'instructions 2
est ex�cut�e et le programme reprend ensuite � la premi�re instruction
suivant le mot cl� end, etc. Si
aucune des expressions logiques 1 � N n'est vraie alors s�quence d'instructions par d�faut est ex�cut�e.
Remarque :
Attention � ne pas
laisser d'espace entre else et if; le mot cl� est elseif.
On utilise fr�quemment un choix en cascade lors d'initialisation de donn�es. Par exemple, on initialise une matrice A en fonction de la valeur d'une variable numex (num�ro d'exemple) de la mani�re suivante:
if numex == 1
A = ones(n);
elseif numex == 2
A = magic(n);
elseif numex == 3 | numex == 4
A = rand(n);
else
error('numero d''exemple non prevu ...');
end
Syntaxe :
casecst1,
s�quence d'instructions 1
casecst2,
s�quence d'instructions 2
...
casecstN,
s�quence d'instructions N
otherwise
s�quence d'instructions par d�faut
end
o�
Interpr�tation :
Si la variable var est �gale � l'une des constantes cst1, ..., cstN, (par exemple csti) alors la s�quence d'instructions
correspondante (ici s�quence d'instructions i)
est ex�cut�e. Le programme reprend ensuite � la premi�re instruction suivant le
mot-cl� end. Si la variable var n'est �gale � aucune des constantes la s�quence d'instructions par d�faut est ex�cut�e.
Remarque :
La variable var
doit bien entendu �tre du m�me type que les constantes cst1, ..., cstN.
Il n'est pas n�cessaire de
pr�voir un cas par d�faut (bien que cela soit pr�f�rable). S'il n'y a pas de cas
par d�faut et si la variable var n'est �gale
� aucune des constantes, alors le programme continue � la premi�re instruction
suivant le mot-cl� end.
Il est possible
de regrouper plusieurs << cas >> si la s�quence d'instructions � ex�cuter est la m�me
pour ces diff�rents cas. La syntaxe est alors,
case{ cstk , cstl , ...}
s�quence d'instructions commune
Reprenons l'exemple o� l'on souhaite initialiser une matrice A en fonction de la valeur prise par une variable num�rique numex (num�ro d'exemple). En utilisant un choix ventil� on obtient:
function A = initA(n,numex)
switch numex
case 1,
A = ones(n)
case 2,
A = magic(n);
case {3,4},
A = rand(n);
otherwise
error('numero d''exemple non prevu ...');
endVoici un exemple de choix ventil� portant sur une variable de
type cha�ne de caract�res. rep = input('Votre reponse (oui, non, chepas) :');
switch rep
case {'oui','o'},
disp('bravo ...');
case {'non','n'}
disp('perdu ...');
case 'chepas'
disp('c''est pourtant facile ...');
end
L'instruction errorpermet
d'arr�ter un programme et d'afficher un message d'erreur. La syntaxe est error(' message d''erreur
'). L'instruction warning
permet d'afficher un message de mise en garde sans suspendre
l'ex�cution du programme. La syntaxe est warning(' message de mise en garde '). Il est
possible d'indiquer � MATLAB de ne pas afficher les messages de mise en garde
d'un programme en tapant warning off dans la
fen�tre de commandes. On r�tablit l'affichage en tapant warning on.
On peut ainsi am�liorer la fonction matale de la mani�re suivante:
function [A,rang] = matale(T,m,n)
% Construit une matrice A de m lignes et n colonnes ayant des elements
% entiers generes de maniere aleatoire entre 0 et T.
% Calcule le rang de la matrice si l'appel est effectue avec 2 arguments
% de sortie.
% Si la matrice est carree, le parametre n peut etre omis.
%
% Appels:
% [A,r] = Matale(T,m,n)
% [A,r] = Matale(T,m)
% A = Matale(T,m,n)
% A = Matale(T,m)
% si la fonction est appelee avec un nombre d'arguments d'entree
% different de 2 ou 3, on arrete tout ...
if nargin ~= 2 & nargin ~= 3,
error(' La fonction matale doit avoir 2 ou 3 arguments d''entree ');
end
if nargin == 2
A = fix(T*rand(m));
else
A = fix(T*rand(m,n));
end
if nargout == 2
rang = rank(A);
if nargin == 2,
rangx = m;
else
rangx = min([m,n]);
end
if rang ~= rangx, warning(' Le rang n''est pas maximum '); end;
endOn obtient alors les messages suivants: >> A = matale(3); ??? Error using ==> matale La fonction matale doit avoir 2 ou 3 arguments d'entree >> A = matale(20,3) A = 8 18 8 12 14 18 15 3 18 >> [A,r] = matale(20,3) Warning: Le rang n'est pas maximum > In /home0/maths/balac/DOCMATLAB/matale.m at line 34 A = 1 4 3 10 15 11 3 12 9 r = 2 >>La commande pause permet d'interrompre l'ex�cution du programme. L'ex�cution normale reprend d�s que l'utilisateur enfonce une touche du clavier. L'instruction pause(n) suspend l'ex�cution du programme pendant n secondes.
Notons l(x) le num�ro de la ligne et c(x) le num�ro de la colonne du carr� sur lequel se trouve l'entier x. Partant d'un carr� d'ordre impair n=2k+1, la technique de Moschopoulos peut se formuler comme suit:
si x n'est pas un multiple de n, alors
l(x+1) = 1 + l(x) modulo(n)
c(x+1) = 1 + c(x) modulo(n)si x est un multiple de n, alors
l(x+1) = 2 + l(x) modulo(n)
c(x+1) = c(x) modulo(n)
Dans ces r�gles pour la prise du modulo, le syst�me de r�sidus que l'on
consid�re est 1, 2, ..., n et non pas 0, 1, ..., n-1.
La fonction magik met en oeuvre la m�thode de Moschopoulos.
function M = magik(n) % % Calcule le carre magique d'ordre n selon la methode % de Moschopoulous. % % Entree: % n : ordre du carre (entier impair) % Sortie: % M : le carre magique % if rem(n,2) == 0, msg = ['la methode de Moschopoulous ne construit que des carres' ... ,' d''ordre impair']; error(msg) end k = (n-1)/2; l(1) = k+2; c(1) = k+1; M(l(1),c(1)) = 1; for x = 2:n.^2 [l(x),c(x)] = pos(x-1,l(x-1),c(x-1),n); M(l(x),c(x)) = x; % ou plus simplement M(pos(x,l(x-1),c(x-1))) = x; endLa fonction utilise la fonction pos. Cette derni�re fonction peut soit �tre �crite � la suite de la fonction magik si l'on dispose de la version 5 de MATLAB (dans ce cas il s'agira d'une sous-fonction qui ne sera visible que de la fonction magik) soit �tre sauvegard�e dans un fichierpos.m.
function [ly,cy] = pos(x,lx,cx,n) % % Retourne la position (indice de ligne ly et indice de colonne cy) % dans le carre magique d'ordre n de l'entier y = x+1 selon la % regle de Moschopoulous. % % Entree: % n : ordre du carre (entier impair) % x : l'entier considere % lx : indice de ligne de l'entier x dans le carre magique % cx : indice de colonne de l'entier x dans le carre magique % % Sortie: % ly : indice de ligne de l'entier y=x+1 dans le carre magique % cy : indice de colonne de l'entier y=x+1 dans le carre magique % if rem(x,n) == 0 ly = modulo(2+lx,n); cy = modulo(cx,n); else ly = modulo(1+lx,n); cy = modulo(1+cx,n); end
Voici quelques exemples d'utilisation de la fonction
magik. On v�rifie
que la somme des �l�ments des diff�rentes lignes ainsi que la somme des �l�ments
des diff�rentes colonnes sont bien constantes. Pour calculer la somme des
�l�ments diagonaux c'est un peu plus compliqu�. On remarque que le carr� magique
construit diff�re du carr� magique retourn� par la fonction MATLAB incorpor�e magic.
>> magik(4) ??? Error using ==> magik la methode de Moschopoulous ne construit que des carres d'ordre impair >> magik(5) ans = 11 24 7 20 3 4 12 25 8 16 17 5 13 21 9 10 18 1 14 22 23 6 19 2 15 >> sum(magik(5),1) ans = 65 65 65 65 65 >> sum(magik(5),2) ans = 65 65 65 65 65 >> magic(5) ans = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
|
|
ce site est un produit des étudiants en Informatique de l'université de Yaoundé I, et � pour but de permettre au COMSAS d'accomplir sa t�che qui n'est autre que la vulgarisation de l'informatique et l'instauration d'un esprit de partage et de solidarité entre les �tudiants. |