I.N.S.S.E.T. – Université de Picardie Licence Maths et SPI – 2ème année
Programmation avec Matlab M. Marcoux
TP 3 : Programmation et algorithmique en langage Matlab
1. Introduction
Ce TP illustre et propose de mettre en œuvre les principales syntaxes de programmation algorithmique utilisables sous Matlab.
Il présente aussi les opérateurs relationnels permettant d’effectuer des tests conditionnels.
Les structures conditionnelles et itératives sont présentées par l’intermédiaire d’algorithmes simples.
L’ensemble des scripts d’exemples et d’applications réalisés au cours du TP devront être commentés de manière abondante.
2. Structures conditionnelles
Il existe deux structures possibles permettant de réaliser des tests sur les données.
• La structure if permet de tester la valeur d’une variable et d’effectuer différents traitements suivant les cas testés.
• La structure switch permet de choisir entre différents cas, et de faire correspondre un traitement adapté à chacun des cas reconnus
a) Structure if … else … end
La structure if est indispensable à la programmation. Elle est présente dans tous les langages, mais utilise des syntaxes un peu différentes.
En langage Matlab, elle est déclarée de la manière suivante :
If condition 1 Commandes Elseif condition 2 Commandes Elseif condition 3 Commandes
:
else
Commandes end
Seul le if … end est obligatoire.
Else et elseif sont facultatifs et permettent d’effectuer des tests supplémentaires.
Le script suivant vous donne un exemple d’utilisation de la fonction if sous Matlab.
Tapez ce script dans un fichier "encadre.m" et testez les différents cas possibles.
% Exemple d’utilisation de if, elseif, … end nb = input(‘Rentrez un nombre : ‘) ;
if (nb < 100)
disp(‘votre nombre est < 100’) elseif (nb == 100)
disp(‘Votre nombre est 100’) else
disp(‘votre nombre est > 100’) ; end
Ø Modifiez ensuite ce script pour qu’il indique en plus si le nombre est compris entre 100 et 200.
Remarque : Lorsqu’un test est effectué en bloc sur un vecteur, il suffit qu’une valeur ne vérifie pas le test pour que la condition ne soit pas vérifiée.
Essayez et commentez l’exemple ci-dessous
>> a = zeros(1,10) ;
>> if a == 0, a(5) = 1, end
???
>> if a == 0,a(5) = 0, end
???
b) Structure Switch … case … end
La deuxième structure permet le choix entre différents cas. Le seul test effectué dans cette structure est donc un test d’égalité.
Cette structure est déclarée par :
Switch variable_testée
Case choix 1 (valeur prise par variable-testée) Commandes
Case choix 2 Commandes Case choix 3 Commandes :
otherwise
Commandes end
Le test d’égalité est donc effectué par la fonction par rapport à chaque cas (case).
Otherwise est une alternative lorsque la variable testée n’a pas d’égaux parmis les différents cas.
Le script suivant vous donne un exemple d’utilisation de la fonction switch sous Matlab.
Tapez ce script dans le fichier "semaine.m" et testez les différents cas possibles.
% Un exemple d’utilisation de switch
jour = input('Quel jour sommes nous ? ', ' s ' ) ; switch jour
case ' lundi ' jr = 5;
case ' mardi ' jr = 4;
case ' mercredi ' jr = 3;
case ' jeudi ' jr = 2;
case ' vendredi ' jr = 1;
otherwise jr = 0;
end
disp ([ 'Encore ' num2str(jr) ' jours avant le weekend’ ])
Ø Modifiez ce script pour qu’il indique "c’est le week end" si le jour est samedi ou dimanche et qu’il indique "ce n’est pas un jour de la semaine" si la chaîne rentrée par l’utilisateur ne correspond pas à un jour de la semaine.
c) Applications
1. Ecrivez une fonction intitulée "signe.m" calculant le signe d’un nombre (-1, 0 ou 1 suivant que le nombre est négatif, nul ou positif).
2. Écrivez un script intitulé "conversion.m" permettant d'effectuer la conversion de Franc vers Euro ou de Euro vers Franc (rappel : 1 euro = 6.55957 francs). Dans un premier temps, le sens de conversion est choisi par l'utilisateur, avant qu'il n’entre le montant (en 2 questions).
3. Structures itératives
Il existe deux grands types de boucles : les boucles de type for dont on connaît le nombre d’itérations et les boucles de type while dont le nombre d’itérations peut évoluer à l’intérieur de la boucle.
a) Structure For … end
La structure for se présente comme suit :
For vecteur des valeurs Commandes
End
Cette structure est à éviter autant que possible sous Matlab car elle est très coûteuse en temps de calcul par rapport au calcul matriciel.
Dans de nombreux cas, il est possible de faire des traitements en blocs, par des opérations sur les matrices, et il n’est pas nécessaire d’utiliser les boucles for.
Les principaux cas où il est nécessaire d’utiliser ces boucles sont :
• La génération de suites récurrentes, dans lesquelles il est nécessaire de connaître un ou plusieurs termes pour calculer le terme suivant
• Le traitement répétitif de données de longueurs différentes qui ne peuvent donc pas être rangée sous forme matricielle
• La demande à l’utilisateur d’un nombre connu de valeurs nécessaires pour la suite du programme
L’utilisation des fonctions tic et toc entre une série de commandes permet de voir le temps mis pour effectuer ces commandes. Ceci permet par exemple de comparer l’efficacité en temps de deux algorithmes différents réalisant la même fonction.
Testez l’exemple suivant permettant de comparer le temps mis pour la création d’un vecteur de 1000 points, avec et sans boucle for.
% Un exemple de boucle for tic
vect = [] ; for k = 1 :1000 vect(k) = log(k) ; end
toc
% ceci est equivalent à : tic
k = (1:1000);
vect = log(k);
toc
Ø Créez un script intitulé "tri.m" demandant successivement à l’utilisateur 5 valeurs qui seront rangées dans une variable de type vecteur appelée valeurs.
Elles seront demandées lors d’une boucle for, à chaque itération.
Une fois rentrées, ces valeurs seront affichées dans l’ordre croissant.
Le tri des valeurs d’un vecteur peut etre effectué grâce à la fonction sort, dont vous regarderez l’aide.
b) Structure while … end
La structure while se présente comme suit :
While test sur une variable Commandes
End
La boucle continue donc tant que le test renvoie une valeur de 1. Ce test est aussi appelé condition d’arrêt.
La variable de test doit donc être actualisée pendant l’exécution de la boucle afin que celle-ci s’arrête. Elle doit aussi être initialisée avant la première exécution de sorte que le test renvoie 1, et que la boucle soit effectuée au moins une fois.
Il peut aussi arriver volontairement dans le déroulement d’un programme qu’une boucle while ne soit jamais exécutée.
Essayez l’exemple suivant dans un fichier script "confirme.m".
% Un exemple de boucle while
% (nombre d’itérations inconnu)
% initialisation de la variable du test reponse = 'cekonveutmaipawi' ;
while(strcmp('oui ',reponse)~=1)
reponse = input('voulez vous arreter ?','s') ; end
Ø Modifiez le script précédent pour que la question posée soit "voulez-vous continuer ?" et qu’une réponse autre que "oui" ou "non" entraîne la remarque "je ne comprends pas la réponse" avant de recommencer la boucle.
c) Application
Ø Modifiez le programme de conversion Franc Euro réalisé précédemment pour rentrer le montant et l'unité en une fois, sous forme de chaîne de caractères. Séparez le montant et les unités, pour convertir le montant en chiffre et effectuer les opérations demandées.
Enregistrez ce nouveau script dans un fichier "conversion2.m".
4. Opérateurs relationnels
Les opérateurs relationnels sont utilisés pour effectuer les différents tests nécessaires dans les boucles et structures conditionnelles (help relop).
On distingue les opérateurs logiques des opérateurs arithmétiques :
a) Opérateurs logiques
Ce sont les fonctions OU (OR), notée ' | ' , ET (AND), notée ' & ' , COMPLEMENT (NOT), notée ' xor(a,b) ' qui considèrent tous les nombres comme binaires, prenant la valeur 0 pour les nombres nuls et la valeur 1 pour les autres.
La comparaison est possible entre des matrices de même taille ou par rapport à un scalaire.
Essayez et expliquez les tests suivants :
>> ~(-3 : 4)
>> xor(~(-1 : 1),(-1 : 1))
>> (eye(3) & 1)
>> (eye(3) | 0)
b) Opérateurs arithmétiques
Ce sont les 6 fonctions de comparaisons entre les nombres :
• Supériorité >, >=, <, <=
• Egalité == et différence ~=
Les tests s’effectuent par rapport aux valeurs des nombres mais le résultat à ces tests prend la valeur 1 quand ce test est vrai et la valeur 0 quand il est faut.
La comparaison est possible entre des matrices de même taille ou par rapport à un scalaire.
Essayez et expliquez le test suivant :
>> (eye(3) == 0)
>> B = (eye(3) ~=1)
>> (1 :10) > 3.5
>> (1 :10) <= 5
>> sqrt(0 :.2 :2) <= (0 :.2 :2).^2
>> (1 :10) > 4 & (1 :10) <=6
5. Autres fonctions
Une fonction très utile de Matlab pour le traitement en bloc des données, c'est-à-dire sans faire de boucle for, est la fonction find qui permet en plus d’effectuer un test sur une matrice ou un vecteur, de récupérer les indices correspondant aux éléments vérifiant le test.
Cette fonction permet alors de traiter en bloc tous les indices de la matrice vérifiant le test, en évitant souvent une boucle for.
Testez et commentez les exemples suivants :
>> a = (1 : 10) ;
>> indices = find(a > 3.5)
>> a(indices) = -a(indices)
>> B = eye(3) ;
>> B = find(B == 0)) = 2
Cette fonction permet aussi de travailler sur les chaînes de caractères, pour repérer par exemple un caractère spécial ou attendu.
Les fonctions utiles à cette fin sont :
• Lower(chaine) qui permet de passer une chaîne contenant des caractères en majuscules en minuscules. La distinction entre majuscules et minuscules est ainsi supprimée.
>> lower(' BlaBLA')
>> chaine = 'BonJouR Les L2' ;
>> indices = find(lower(chaine) == 'l')
>> disp(chaine(1:indices-1))
• str2num(chaine) convertit une chaîne de caractères représentant un nombre en ce nombre.
Il faut en effet bien dissocier les chaînes de caractères et ce qu’elles représentent.
Une chaîne de caractères est codée par la valeur ASCII des caractères, c'est-à-dire des entiers entre 0 et 255.
Par exemple :
>> chaine =’1024’
>> chaine + 10 % ceci ajoute 10 à la valeur ASCII de chaque caractère
>> char(chaine + 10) %Affiche les valeurs ASCII en caractères
>> b = str2num(chaine) + 10
6. Application : Ecrêtage
Ø Créez un script "ecretage.m" permettant à l'utilisateur d'entrer une de fréquence et une amplitude pour un sinus.
Ø Générez alors un vecteur de taille (N) contenant le sinus correspondant aux caractéristiques rentrées précédemment sur une période (N est le nombre de points temporels, fixé dans le script à 256).
On désire alors écrêter ce sinus par rapport à un seuil demandé à l'utilisateur (entre 0 et l'amplitude maximale). Cela revient à chercher les valeurs du signal situées en dehors de l'intervalle
[
−seuil;+seuil]
et à les fixer à . ±seuilØ Afficher dans une figure, sur deux sous-figures, les signaux originaux et les signaux écrêtés.
Ø Enregistrez la figure obtenue dans une image "ecretage.jpg".