Overblog Suivre ce blog
Editer la page Administration Créer mon blog
/ / /


1.4.1 Chaine = vecteur de caractères


Une chaînes de caractères est encadrée par deux apostrophes.


>> c = ’La variable c contient une chaine de caracteres’


Les textes sont représentés par des tableaux de caractères. La variable c est un vecteur

de 48 caractères. La plupart des opérations  s’appliquent.

 

Les instructions

>> c = [c,’.’], c(length(c):-1:1)
c =

     La variable c contient une chaine de caracteres.

ans =
          .seretcarac ed eniahc enu tneitnoc c elbairav aL


Certaines fonctions permettent de transformer chaines en valeurs numériques et vice versa.


>> two = 2, second = num2str(two)
two =
          2                             
double array / 1x1 / 8 bytes
second =
                  2                     
char array / 1x1 /  2 bytes

 

 

 

1.4.2 Affichage, lecture et évaluation


Certaines fonctions utilisent une chaine de caractère comme argument d’entrée.

Par  exemple,

disp affiche un message à l'écran,

error termine l’exécution d’une fonction et retourne un message,

input affiche un message et attend une entrée au clavier.
eval et feval permettent d’exécuter une instruction à partir d’une chaîne de caractères.

Par exemple, l’instruction

 

>> for i=2:5, eval([’I’,num2str(i),’=eye(i)’]), end


retourne les matrices identités de dimension 2, 3, 4 et 5 dans des variables I2, . . . , I5.
La fonction feval permet de passer des arguments d’entrée.

 

 

 

 

1.5 - BOUCLES, CONDITIONS etc...

 

1.5.1  - Fichiers script

 

Un script est un fichier contenant une suite d’instructions qui sont exécutées séquentiellement
à l’appel du fichier. L’utilisation d’un script est très courante, cela evite d’avoir à saisir plusieurs fois de longues suites d’instructions.

 

Pour ´editer un script, on peut utiliser son éditeur préféré ou bien l’´editeur par d´efaut de Matlab avec la
commande edit.

Le fichier doit être sauvegardé avec l’extension .m.

L’exemple suivant est un fichier script sauvegardé dans le répertoire courant sous le nom durer.m.

Les lignes commençant par le caractère % sont des commentaires.


% durer.m version du 23 septembre 2002
% calculs dans l’espace des matrices magiques d’ordre 4
% base de l’espace
C1 = [1 0 0 0; 0 0 0 1; 0 1 0 0; 0 0 1 0]
C2 = [0 1 0 0; 0 0 1 0; 1 0 0 0; 0 0 0 1]
C3 = [0 0 0 1; 0 1 0 0; 1 0 0 0; 0 0 1 0]
C4 = [0 1 0 0; 0 0 0 1; 0 0 1 0; 1 0 0 0]
C5 = C4’
C6 = C3’
C7 = C1’
% matrice de la gravure de D¨urer
D = [16 3 2 13;5 10 11 8 ; 9 6 7 12; 4 15 14 1]
% d´ecomposition de D sur la famille {C1, ..., C7}
C = [C1(:),C2(:),C3(:),C4(:),C5(:),C6(:),C7(:)]
x = C\D(:)


Pour exécuter les instructions de ce fichier, entrer le nom du fichier, sans l’extension,
dans la fenêtre des commandes de Matlab.


>> durer

 

 

 

 

1.5.2 -  Chemin d’accès

 

Pour que Matlab associe correctement la commande durer avec le fichier durer.m, il faut que ce fichier soit dans le répertoire courant (le nom du répertoire courant est obtenu avec la commande pwd) ou bien dans un des répertoires de la liste PATH obtenue avec la commande path.

 

Si la r´eponse de Matlab est

 

??? Undefined function or variable ’durer’.

 

cela signifie que Matlab ne trouve pas le fichier durer.m. Dans ce cas, il faut en premier s’assurer que le fichier existe dans un des répertoires. Si le contenu du fichier est visible dans la fenêtre de l'éditeur, soit il n’a pas été sauvegardé, soit il a été sauvegardé dans un répertoire différent du répertoire courant.

 

Pour rechercher un fichier on peut utiliser la commande Unix suivante (à saisir dans une fenêtre de terminal) :
find ~ -name durer.m

 

On peut aussi saisir la commande dans la fenêtre de Matlab en la faisant précéder d’un ! :


>> ! find ~ -name durer.m
/users/math/armand/ens/matlab/doc/durer.m

 
Unix va retourner la liste des répertoires qui contiennent un fichier durer.m. Si le fichier n’existe pas, la liste est vide. Si le fichier existe, c’est que le répertoire courant  de Matlab ne correspond pas au répertoire qui contient le fichier.

Il suffit alors de changer de répertoire courant avec la commande cd de Matlab.

Il est aussi possible de modifier la liste PATH, avec la commande path elle-même ou bien en sélectionnant Set
Path
dans le menu File du bureau Matlab.

 

 

 

 

1.5.3 Branchement conditionnel (If...then...else)

 

L’instruction if permet d’exécuter un bloc d’instructions en fonction de la valeur logique d’une expression. Sa syntaxe est :


if expression
instructions
end

 

Le groupe d’instructions est exécuté si seulement si l’expression est vraie. Il est possible d’utiliser des branchements multiples.


if length(x) ~= 1
’non scalaire’
elseif isnan(x)
’NaN’
elseif x > 0
’positif’
elseif x < 0
’negatif’
else
’nul’
end

 

Si A et B sont deux matrices, il est possible d’utiliser l’expression A == B comme test logique.

Le bloc d’instructions venant à  la suite du if A == B est exécuté si et seulement si les deux matrices sont égales. Attention cependant à ce test d’égalité, car il renvoie un message d’erreur si les deux matrices n’ont pas les mêmes dimensions. Il est préférable d’utiliser la fonction isequal pour tester l’égalité entre plusieurs matrices.

 

1.5.4   -  Branchement multiple (Switch)

 

C’est une instruction de branchement conditionnel. Sa syntaxe est :


switch expression
case valeur 1
instructions 1
case valeur 2
instructions 2
...
otherwise
instructions
end

 

expression doit être un scalaire ou une chaîne de caractère.

Dans le cas scalaire, expression est comparée successivement avec valeur 1, valeur 2, etc.

Dès que le premier test expression==valeur retourne la valeur vraie, le bloc d’instruction qui
suit est exécuté. Si aucun test n’est validé, le bloc qui suit otherwise est exécuté.

 

switch mod(x,3)
case 0
’multiple de 3’
case 1
’x = 3 [1]’
case 2
’x = 3 [2]’
otherwise
’autre’

end

 

 

L’exemple ci-dessous prsente un cas où expression est une chaîne de caractères.
Noter l’utilisation des points de suspension pour continuer une instruction sur la ligne
suivante.


switch lower(car)
case {’a’,’e’,’i’,’o’,’u’,’y’}
disp([car ’ est une voyelle’])
case {’b’,’c’,’d’,’f’,’g’,’h’,’j’,’k’,’l’,’m’,’n’,’p’,...
’q’,’r’,’s’,’t’,’v’,’w’,’x’,’z’}
disp([car ’ est une consonne’])
case {’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’}
disp([car ’ est un chiffre’])
otherwise
’autre’
end

 

1.5.5   -  Boucle finie (For)

 

Une boucle for permet de répéter un certain nombre de fois un bloc d’instructions.
Sa syntaxe est :


for variable = expression
instructions
end

 
L’exemple suivant permet d’´editer une table de multiplication.

 

n = 10; t = 1:n;
T = [ ];
for i = 1:n
T = [T;t*i];
end
T

 

Plusieurs boucles peuvent être imbriquées, comme dans l’exemple qui suit (calcul d’une
matrice de Hilbert).


H = [ ]; n = 10; m=n;
for i = 1:n
for j = 1:m
H(i,j) = 1/(i+j-1);
end
end
H

 
La variable de contrôle peut être un vecteur et l’expression une matrice.

Par exemple :


>> for u = eye(4), u, end

 
énumère les vecteurs de la base canonique de l’espace euclidien de dimension 4.

 

 


1.5.6   -  Boucle infinie (While)

 

Une boucle while permet d’exécuter un bloc d’instructions tant qu’une expression logique est vraie. Sa syntaxe est :

 

while expression
instructions
end

 
L’exemple suivant permet de calculer le epsilon machine (= plus petite distance entre 1.0 et le nombre flottant suivant).

e = 1;
while 1+e > 1
e = e/2
end
epsilon = 2*e

 

Attention à modifier la valeur de la variable de contrôle dans le bloc d’instructions, sinon
la boucle n’a pas de fin.

 

Pour forcer l’interruption d’une boucle en cours d’exécution, utiliser la combinaison de touches Ctrl–C.
L’instruction break permet de terminer l’exécution d’une boucle while ou for.

 

Elle peut être utile lorsqu’on veut placer le test de contrôle ailleurs qu’en début de boucle.

 

L’instruction continue permet de passer à la prochaine itération de la boucle while ou for qui la contient, en sautant les instructions qui lui font suite dans le corps de cette boucle.

 

 

Des habitudes de programmation nous poussent souvent à utiliser une ou plusieurs boucles for ou while lorqu’il s’agit d’effectuer une opération sur chaque élément d’un tableau. Avec Matlab il faut toujours avoir présent à l’esprit que la plupart des opérations peuvent agir sur tous les éléments d’une matrice ou bien sur tous ses vecteurs colonnes simultanément.

 

Il ne faut pas hésiter à remplacer une boucle par quelques instructions  simples à chaque fois que cela est possible, il en résultera un gain en rapidité d’exécution.

 

 Prenons l’exemple du calcul d’une table de multiplication. Dans l’exemple
précédent, la boucle for peut avantageusement être remplacée par l’instruction


n = 10; t = 1:n;
T = t’*t;

 

Avec n = 10 on obtient un gain en rapidité d’exécution d’environ 3, avec n = 500 le gain est supérieur à 350.

 

 

 

1.6 - LES FONCTIONS

 

1.6.1  - Déclaration, arguments


Une fonction est un fichier texte dont la première ligne contient un en-tête de la forme suivante :


function [s1, s2, ...] = nom_fonction (e1, e2, ...)


Le reste du fichier contient la suite des instructions qui sont exécutées lors de l’appel de la fonction.

Les variables e1, e2, . . . , sont les arguments d’entrée de la fonction. Les variables s1, s2, . . . , sont les arguments de sortie.

 

Il existe des différences importantes entre un script et une fonction.

 

Une fonction possède son propre espace de travail. Une variable utilisée à l’intérieur du corps de la
fonction possède un caractère local, elle n’existe que pendant l’exécution de la fonction, sauf si elle appartient à la liste des arguments de sortie ou bien si elle a été préalablement  d´eclarée comme variable globale (mot-clé global).

 

De même, une variable de l’espace de travail courant, ne peut pas être référencée depuis une fonction, sauf si elle est passée en argument d’entrée ou bien si elle est globale.


Voici un exemple très simple. La fonction caracter retourne la valeur de la fonction
caractéristique de l’intervalle [0, 1] (f(x) = 1 si x 2 [0, 1], = 0 sinon).

 

Si l’argument n’est pas de type numérique elle renvoie un message d’erreur.


function [y] = caracter(x)
%CARACTER Fonction caracteristique de [0,1]
% CARACTER(X) retourne la valeur de la fonction caracteristique
% de [0,1] evaluee sur les elements de X
if isnumeric(x)
    y = x>=0 & x <=1;
else
    error(’Argument non numerique’)
end

 

Ce fichier est sauvegardé dans le répertoire courant sous le nom caracter.m. L’entête contient le mot-clé  function, une seule variable de sortie, le nom de la fonction suivi de l’unique argument d’entrée.

Les trois lignes de commentaires qui suivent constituent les lignes d’aide qui seront affichées avec la commande help caracter.

Les lignes d’aide sont les premières lignes de commentaires contigües situées après l’en-tête, les autres lignes de commentaire sont ignorées par le help. La première ligne de commentaire constitue la ligne H1. C’est dans cette ligne que la fonction lookfor recherche un mot-clé. Par exemple, lookfor car, renvoie


CARACTER Fonction caracteristique de [0,1]
CART2POL Transform Cartesian to polar coordinates.
CART2SPH Transform Cartesian to spherical coordinates.
...
 


Ensuite viennent les instructions qui constituent la partie exécutable de la fonction.
L’appel de cette fonction peut se faire dans le corps d’une autre fonction, dans un script ou directement dans la fenêtre des commandes, sous réserve que le chemin d’accès au fichier caracter.m soit le répertoire courant ou bien qu’il soit indiqué dans le PATH.
L’association entre l’appel à une fonction et le fichier où est sauvegardé le texte de la fonction, obéit aux mêmes règles que pour un fichier script.

 

>> a = [0, 3, .4, -5, 1/2, pi], b = caracter(a)
L’instruction ci-dessus renvoie
b =
     1     0     1    0     1     0

 

 

 

 

1.6.2     -    Exemple d'une  résolution d’une équation non linéaire


Dans l’exemple ci-dessous, nous montrons comment passer une fonction comme argument d’entrée d’une autre fonction. Il s’agit de programmer une méthode de résolution numérique d’une équation non linéaire


g(x) = 0,
où  g : Rn → Rn. La méthode que nous voulons programmer et tester est due à Barzilai et Borwein. C’est une méthode itérative qui génère une suite de vecteurs {xk}k≥1 par la récurrence

 

 

                                                 xk+1 = xk − αkg(xk),

 

Algorithme Barzilai-Borwein

 

Entrée : ε, x1.        Sortie : x*,     tel que ||g(x*)|| ≤ε.

 

1. Poser k = 1.
2. Calculer g(xk).
3. Si ||g(xk)|| ≤ε, stop.
4. Calculer α k.
5. xk+1 = xk − αkg(xk).
6. k = k + 1 et retour en 2.

 

 

 


function x = abb(fonc,x,epsilon,maxiter)
%ABB Resolution d’une equation non lineaire, methode de Barzilai-Borwein
%
% Entree : fonc = fonction test
% x = point de départ
% epsilon = tolérance du test d’arrêt, valeur par défaut 1e-8
% maxiter = nombre maximum d’itérations, valeur par défaut 100
%
% Sortie : x = solution
% vérification du nombre d’arguments d’entrée et valeurs par défaut
if nargin < 2, error(’Nombre d’’arguments d’’entree trop petit’); end
if nargin < 3, epsilon = 1e-8; end
if nargin < 4, maxiter = 100; end
iter = 1; % compteur it´eration
while iter <= maxiter
    g = feval(fonc,x);
    if norm(g) <= epsilon, break, end
    if iter == 1, a = 1; else a = norm(x-x_)^2/dot(x-x_,g-g_); end
    x_ = x;
    g_ = g;
    x = x-a*g;
    iter = iter + 1;
end
if iter > maxiter, warning(’nombre maximum d’’iterations atteint’), end

 

La fonction abb est sauvegardée dans un fichier appelé abb.m. Un contrôle du
nombre d’arguments d’entrée est effectué grâce à la variable nargin. Cette fonction
indique le nombre d’arguments d’entrée présents à l’appel de la fonction abb.

 

Si par exemple les valeurs des deux premiers arguments entrée sont données, les variables
epsilon et maxiter sont initialisées à leur valeurs par défaut.

 

Supposons que l’on veuille tester la méthode sur la fonction          x 2 Rn ! (ex1 − 1, . . . , exn − 1).

Il faut d’abord créer une nouvelle fonction Matlab qui va calculer les valeurs de la
fonction définie ci-dessus.


function g = expon(x)
%EXPON Fonction test
if isnumeric(x), g = exp(x)-1; else error(’Argument non numerique’), end
Supposons que l’on fasse un essai avec n = 10, un point de départ x1 choisi au
hasard (dans un voisinage de 0) et une précision de 10−10 × kg(x1)k.
>> x = rand(1,10); x = abb(@expon,x,1e-10*norm(expon(x)))


Le passage de la fonction comme argument d’entrée de abb se fait en préfixant le nom
de la fonction expon avec le caractère @. Dans la fonction abb, l’appel de expon se fait
grâce à la fonction feval. L’instruction feval(fonc,x) est équivalente à l’instruction
expon(x).


Supposons maintenant que l’on veuille faire un test avec la fonction      x 2 Rn ! (x1, 2x2, . . . , nxn).
On crée une nouvelle fonction, appelée prodn.m.


function g = prodn(x)
%PRODN Fonction test
if isnumeric(x),
      [n,m] = size(x);
      if n==1
          g = (1:m).*x;
      elseif m==1
          g = (1:n)’.*x;
      else
          error(’L’’argument n’’est pas un vecteur’)
      end
else
      error(’Argument non numerique’)
end

 

Le test se fait comme précédemment :


>> x = rand(1,10); x = abb(@prodn,x,1e-10*norm(prodn(x)))

Partager cette page

Repost 0
Published by

Présentation

  • : Le blog de outilsrecherche
  • Le blog de outilsrecherche
  • : Blog d'un thésard qui partage ses connaissances et ses recherches. Logiciels, environnements, notes perso, Parole, reconnaissance automatique, modélisation, acoustique, biologie, cognition, neuro-sciences, langage, audition, production de la parole traitement du signal et informatique
  • Contact

Recherche

Archives

Liens