Formation Matlab, tutoriel & guide de travaux pratiques en pdf.
Les structures
Les structures permettent d’organiser vos donnees, je ne saurais trop vous conseiller de vous definir un format de structure standard `a toutes vos fonctions : par exemple un format pour les signaux avec un vecteur de date, une matrice de valeur et des champs d’informations. On peut simplement creer une structure par affectation, comme ceci :
>> s.chiffre = 1; s.chaine=’toto’; s.cellarray={1,’toto’} ; s.vecteur=[1;2;3;4];s
s =chiffre: 1 chaine: ’toto’ cellarray: {[1] ’toto’} vecteur: [4×1 double]
Notez `a pr´esent, que chaque champs de notre structure est nomm´e, ce qui explicite la syntaxe suivante :
>> s = struct(’chiffre’,1,’chaine’,’toto’,’cellarray’,{{1,’toto’}},’vecteur’,[1;2;3;4])
s =chiffre: 1 chaine: ’toto’ cellarray: {[1] ’toto’} vecteur: [4×1 double]
Il y a deux choses `a remarquer ici : tout d’abord, les noms de champs sont entr´es en param`etres, dans l’ordre en tant que chaˆınes de caract`eres, c’est une syntaxe tr`es courante en Matlab,équivalente dans d’autres langages `a ce genre de chose : function(chiffre=1,chaine=’toto’,…). D’autrepart,j’aiduˆ doublerlesaccoladespour <cellarray>,sinonMatlabm’aurait cr´e´e un <s> qui aurait ´et´e un Cell Array de la structure d´efinie, avec 2 cellules. Pas ´evidement, essayons…
>> s = struct(’chiffre’,1,’chaine’,’toto’,’cellarray’,{1,’toto’},’vecteur’,[1;2;3;4])
s =1×2 struct array with fields:chiffre chaine cellarray vecteur
>> s(1),s(2)ans =chiffre: 1 chaine: ’toto’ cellarray: 1 vecteur: [4×1 double]
ans =chiffre: 1 chaine: ’toto’ cellarray: ’toto’ vecteur: [4×1 double]
Structures de contrôle
IF ELSE/ELSEIF END
Syntaxe :
if expression1 statements1 elseif expression2 statements2 else statements3 end
Exemple :
if ((attendance >= 0.90) && (grade_average >= 60)) pass = false; end;
SWITCH CASE OTHERWISE END
Syntaxe :
switch switch_expr case case_expr statement, …, statement case {case_expr1, case_expr2, case_expr3, …} statement, …, statement otherwise statement, …, statement end
Exemple :
method = ’Bilinear’;
switch lower(method) case {’linear’,’bilinear’} disp(’Method is linear’) case ’cubic’ disp(’Method is cubic’) case ’nearest’ disp(’Method is nearest’) otherwise disp(’Unknown method.’) end
WHILE END
Syntaxe :while expression statements end
Exemple :eps = 1; while (1+eps) > 1 eps = eps/2; end
FOR END
Syntaxe :for variable = expression statement … statement end
Exemple :a = zeros(k,k) % Preallocate matrix for m = 1:k for n = 1:k a(m,n) = 1/(m+n -1); end end
Création de fonctions
Comme en Java, il est de bon ton d’avoir un fichier <.M> par fonction, et qu’il porte le nom de la fonction. Attention : la casse est importante. Faites aussi attention de bien mettre vos r´epertoires de travail dans le PATH, sinon Matlab ne pourra jamais trouver vos fonctions. Quand vous tapez >> help repmat vous affichez l’aide de la fonction. Il est tr`es simple de faire pareil : Matlab affichera comme aide tout commentaire (%) qui suivra imm´ediatement le prototype de la fonction
Fonctions simples
Syntaxe :function [out1, out2, …] = funname(in1, in2, …)
Cr´ee une fonction de nom funame qui prend in1, in2, …param`etres et en renvoie autant. Il n’est pas n´ecessaire de mettre un end. Exemples :
function [mean,stdev] = stat(x) % STAT – renvoie la moyenne et l’´ecart-type d’une matrice entr´ee. % Use :
% [mean,stdev] = stat(x); % % Example : % >> x = stat([1 2 3 4 5]);
% ceci ne sera pas affich´e dans l’aide n = length(x); mean = sum(x)/n; stdev = sqrt(sum((x-mean).^2/n));
Petite fonction simple, qui calcule la moyenne d’un vecteur ou d’une matrice et son ´ecart-type. Voyez comment on renvoie 2 arguments en sortie. A l’ex´ecution, sionretourneler´esultatdelafonctiondansuneseulevariable,nousytrouverons la sortie la plus `a gauche, c’est `a dire la moyenne ici.
function x = fnan(mode, x, y) % FNAN – replace nan by a value % use: % x = fnan(’replace’,x,value_to_replace_nan) % or % x = fnan(’revert’, x,value_to_revert_to_nan)
if iscell( x) x = cellfun(@(t)(fnan(mode,t,y)), x, ’UniformOutput’,false); return end
switch lower(mode) case {’replace’,’nan->value’} idx = isnan(x); if sum(idx) x(idx) = y; end case {’revert’,’reverse’,’value->nan’} idx = (abs(x-y)<eps); if sum(idx) x(idx) = nan; end otherwise error(’fnan:mode’,’unknown mode <%s>’,mode); end
Fonctions anonymes
Cette fonction remplace la valeur NaN (valeur manquante) dans une matrice par une autre numerique. Elle me sert generalement avant une insertion dans une base de donnees ou je gere une table de correspondances entre le NaN de matlab et une valeur representant la valeur manquante dans ma table.
Il existe quantite de fonctions sous Matlab, qui prennent en parametre un pointeur(handler) vers une autre fonction. Si cette fonction est courte, nous n’aurons peut-etre pas l’envie de creer un fichier .M. Les fonctions anonymes, vous vous en doutez, n’ont pas de nom. Une fois declaree, elles renvoient un handler sur elle meme.
>> t = @(x,y) x+y; >> t(2,3)
ans =5
Dans cette exemple, je cree une fonction anonyme et je recupere son handler dans la variable t. Ensuite j’utilise t comme une fonction. C’est le seul moyen de definir une fonction dans l’interpreteur sans creer un fichier <.M>.
% Keep only workdays estNull = cellfun(@isnan,res(:,2:(end-1))); res = res(~estNull,:);
Dans cet exemple, je supprime de la matrice <res> toutes les lignes qui ont des NaN sur toutes les colonnes autre que la premi`ere. Notez le <…> qui permet de mettre un retour `a la ligne dans une instruction. D´etaillons:j’aiunematrice de5colonnes :lapremi`ere estladate,les autressont des donn´ees. C’est pour cela que j’exclus `a chaque fois la premi`ere colonne avec <(:,2:(end-1))>. Avec <cellfun> j’applique une fonction sur chaque cellule de <res(:,2:(end-1))>, cette fonction est une fonction Matlab standard dont je donne la r´ef´erence. J’aurais tr`es bien pu d´efinir ici une fonction anonyme. J’obtiens donc une matrice logique (de 0 et de 1). Si estNull vaut <true>, il s’agit d’une ligne que je veux supprimer. C’est pourquoi dans la derni`ere ligne, je ne garde que les lignes de res (et toutes les colonnes), dont l’indice en ligne vaut <false> dans <estNull>.