Formation
Initiation à Matlab
Coriandre Vilain
GIPSA-Lab
Janvier 2014
Demandez le programme!
1) Ouverture de Matlab
2) Matrices 3) Chaînes de caractères 4) Visualisation graphique simple 5) Programmes et Fonctions 6) Bases de programmation 7) Gestion des fichiers textes | Séance 1 Séance 2 Séance 3 |
Matlab (Matrix Laboratory) est un logiciel de calcul matriciel à syntaxe 'simple' (relativement à des langages évolués comme C, C++). MATLAB est un interpréteur de commandes: les instructions sont interprétées et exécutées ligne par ligne (pas de compilation avant de les exécuter).
Il existe deux modes de fonctionnement:
qqmode interactif: MATLAB exécute les instructions au fur et à mesure qu'elles sont données par l'usager.
qqmode exécutif: MATLAB exécute ligne par ligne un fichier ".m" (programme en langage MATLAB).
Fenêtre principale : Editeur
elle existe)
nnLes différentes fenêtres :
qqDans la fenêtre d'édition de commande taper x = 1 et visualiser les conséquences sur la fenêtre d'espace de travail et d'historique de commande.
nnLes variables
qqLa variable x a été définie très simplement sans avoir à préciser le type de donnée qu'elle contient ni sa taille : c'est un des grands avantages
Ex: pi = 18, sin = 3, affectation de valeurs à des variables déjà connues de Matlab au risque de se tromper par la suite dans l’interprétation); qqUne variable est définie par sa classe (son type). Ex : double, char…
Pour avoir une information sur une variable x : whos x qqPour effacer la variable x de l'espace de travail, taper clear x qqPour effacer toutes les variables de l'espace de travail taper clear all
Sous matlab, les données sont généralement définies comme des matrices, ie des tableaux à 1, 2 … n dimensions. On ne considérera ici que des tableaux à 1 ou 2 dimensions.
Exemple : qqSi on tape A = 335, on définit une variable A correspondant à une matrice à 1 ligne et 1 colonne contenant le nombre 335. qqSi on tape A = [12 15 138], on définit une variable A correspondant à une matrice à 1 ligne et 3 colonnes contenant les nombre 12, 15 et 138 (On peut parler dans ce cas de vecteur). Les espaces entre les nombres permettent de délimiter les colonnes (on peut aussi utiliser des , pour cela) . qqSi on tape A = [1 3 5 ; 2 4 6], on définit une matrice A à 2 lignes et 3 colonnes. Les caractères ; permettent de passer à la ligne et les espaces délimitent les colonnes. qqConcaténation : si on a A = [1 2 3] et B = [4 5 6 7], on peut concaténer les 2 variables en une seule : C = [A B], on aura alors C = [1 2 3 4 5 6 7]; |
NB : Si l'on ne souhaite pas voir afficher la valeur de la variable qu'on définit, il suffit de terminer la commande par le caractère « ;». La variable est alors bien définie (on le vérifie dans l'espace de travail) mais elle ne s'affiche pas. Si on veut vérifier la valeur de cette variable il suffit de taper le nom de cette variable sans « ; ».
Bon à savoir nnPour créer un vecteur A (matrice à 1 ligne ou 1 colonne) contenant des nombres régulièrement espacés d'un pas p, commençant par le nombre u et finissant par v, il suffit de taper : A = u : p : v
Exemples: qqVecteur commençant par 0 et allant jusqu'à 100 : A = 0:100 qqvecteur commençant par 3 et finissant par 27 par pas de 3 : A = 3 :3 :27 (on aura alors A = [3 6 9 12 15 18 21 24 27] ). |
nnPour transformer un vecteur ligne en vecteur colonne ou inversement, il suffit d'utiliser le caractère ' (apostrophe) après le vecteur à transformer.
Exemple :
qqSi on définit A = [1 4 2 6] (vecteur ligne), alors A' est égal à [1 ;2 ;3 ;4] (vecteur colonne).
NB : le caractère ' est en fait le symbole de transposition, il est applicable à une matrice quelconque. SiA = [1 2 3 ; 4 5 6 ; 7 8 9]alorsA'= [1 4 7 ; 2 5 8 ; 3 6 9]
nnChaque élément d'une matrice est accessible à condition de spécifier sa place dans la matrice. Pour cela, il suffit de donner le numéro de ligne et de colonne entre ().
Exemple : qqSi on a A = [1 5 2 6] alors A(1,2) = 5 (1ère ligne, 2ème colonne). NB : en fait ici, vu que la matrice A ne contient qu'1 seule ligne on peut se contenter d'écrire A(2) pour obtenir 5 qqSi on a A = [1 5 6 ; 2 3 6] alors A(2,2) = 3 (2ème ligne, 2ème colonne). qqLa variable end permet de récupérer les dernier élément d'un vecteur. Si on a A = [1 5 2 6] alors A(end) = 6 |
nnPour récupérer plusieurs éléments d'une matrice, il suffit de préciser l'ensemble des numéros de lignes et de colonnes des éléments à prélever. En particulier, pour récupérer l'ensemble des éléments d'une ligne ou d'une colonne on utilise le caractère ' :'.
Exemple :
qqA = [1 2 4 ; 2 6 8 ; 3 5 4]. qqPour récupérer les 2 premiers éléments de la 2ème ligne : A(2,[1 2]) = [2,6] qqpour récupérer la 3ème ligne : A(3, : ) = [3 5 4] qqpour récupérer la 2ème colonne : A( :,2) = [2 ;6 ;5]
nnAddition / soustraction : 2 matrices de mêmes dimensions (même nombre de lignes et de colonnes) s'additionnent ou se soustraient terme à terme.
Exemple: qqA = [1 2 3 ; 4 5 6] , B = [2 4 6 ; 7 8 -1] A+B = [3 6 9 ; 11 13 5] A-B = [-1 -2 -3 ; -3 -3 7] |
nnMultiplication ou division : la multiplication ou division de matrice obéit à des règles spéciales qu'on ne détaille pas ici. En revanche on peut multiplier ou diviser 2 matrices terme à terme par l'emploi des symboles « .* » ou « ./ »
Exemple: qqA = [1 2 3 ; 4 5 6] , B = [2 4 6 ; 7 8 -1] A.*B = [2 8 18 ; 28 40 -6] A./B = [0.5 0.5 0.5 ; 0.57 0.62 -6] |
nnfonctions trigonométriques : cos, acos, sin, asin, tan, atan, cot, acot nnfonctions logarithmiques : exp, log (log Népérien), log10 (log de base 10)
nnfonctions somme et produits : sum, cumsum, prod, cumprod nngénération de nombres aléatoires : rand, randn … nnPermutations aléatoires : randperm nntransformée de Fourier discrète : fft, ifft … nnArrondis : round, floor, ceil…
NB : pour connaître la syntaxe d'une fonction : taper helpnom_de_la_fonction Exemples : nnA = [1:10]; sin(A) = [0.84 0.91 0.14 -0.76 -0.96 -0.28 0.66 0.99 0.41 -0.54] log(A) = [0 0.69 1.10 1.39 1.61 1.79 1.95 2.08 2.20 2.30] sum(A) = 55 (sum(A) = 1+2+3+4+5+6+7+8+9+10) cumsum(A) = [1 3 6 10 15 21 28 36 45 55] ( somme cumulée) nnrand(1,10) = [0.95 0.23 0.61 0.49 0.89 0.76 0.46 0.02 0.82 0.44] (par exemple) (vecteur à 1 ligne et 10 colonnes obtenu par tirage aléatoire avec une loi de probabilité uniforme : chaque élément compris entre 0 et 1 a la même probabilité de sortir). |
EX 1 :
La formule permettant de calculer rapidement la valeur de la somme des n premiers entiers naturels est la suivante : sn =1+2+3+4+…+n = n*(n+1)/2.
Vérifier cette formule pour différentes valeurs de n : n = 100, n = 100 000.
EX 2 :
1) Générer un vecteur x à 1 ligne et 30 colonnes rempli de 3 en utilisant la fonction ones().
2) Calculer la somme cumulée de x (fonction cumsum()) et l'affecter à la variable y.
3) Prélever un échantillon sur 9 de y et placer ces échantillons dans un vecteur z.
EX 3 : 1) Générer un vecteur x à 1 colonne et 1000 lignes rempli de nombres aléatoires distribués uniformément entre 0 et 1 en utilisant la fonction rand() 2) Calculer la moyenne et l'écart type du vecteur x en utilisant mean() et std() 3) Créer un générateur de 'lancer de dé' ie un générateur de nombre aléatoire entier compris entre 1 et 6 avec une probabilité uniforme (avec rand() et ceil() par exemple) |
nnLes chaînes de caractères sont des matrices de caractères!
nnPour définir une chaîne de caractère on utilise les apostrophes Exemple qqnom = 'dupont'; qqphrase = 'ceci est une phrase'; qqrg = [ 'dupont';'dupond'] |
b) Eléments d'une chaîne de caractères nnPour récupérer certains caractères d'une chaîne de caractères, il suffit de préciser les indices des numéros de lignes et de colonnes correspondant.
Exemple: Nom_du_capitaine = 'Archibald Haddock'; Pour prélever son prénom et le mettre dans la variable prenom_du_capitaine, on peut faire Prenom_du_capitaine = nom_du_capitaine(1:9); On aura alors prenom_du_capitaine = 'Archibald' NB : D'autres possibilités existent si on ne connait pas à l'avance la longueur de la chaîne de caractère correspondant au prénom. On peut par exemple rechercher tous les caractères situés avant l'espace situé entre le prénom et le nom. On verra plus loin! |
nnConcaténation : pour concaténer 2 chaînes de caractères, on peut utiliser les symbole [];
Exemple: a = 'Tryphon' b = ' fait le zouave' c = [a b]; Que croyez vous qu'il arrive si on affiche la valeur de c? |
nnTransposition : on peut transposer une chaîne de caractères avec le symbole « ' »
NB :d'autres opérations sont possibles mais nous les détaillerons dans la partie avancée.
nnPour afficher les valeurs d'un vecteur A = [1 6 3 5 7 9 12], il suffit de taper plot(A). On obtient la figure ci-contre.
En abscisse, la valeur représentée correspond au numéro de l'échantillon.
En ordonnée, la valeur représentée est l'élément de A associé au numéro d'échantillon mentionné en abscisse
NB : Par défaut, matlab relie les points affichés par des lignes. On peut alors avoir l'impression trompeused'un signal continu alors que seules les valeurs des échantillons sont connues (signal discret)!!!
Exemple : plot(A,'+') pour utiliser un marqueur de type '+' plot(A,'-+') pour utiliser un marqueur de type '+' ajouté à une ligne continue NB : on peut aussi utiliser le gestionnaire de figure de Matlab en sélectionnant la flèche de saisie d'objet dans les icones situés au dessus de la figure puis en faisant un click droit sur la figure puis Show Property Editor |
qqOn peut s'affranchir du problème en représentant chaque point par un marqueur.
b) Affichage des valeurs d'un vecteur en fonction d'un autre vecteur
nn Si on veut afficher un vecteur A en fonction d'un autre vecteur X, il suffit de taper : plot(X,A).
qq? | Exemple : X = [1 5 7 9 11 13 15], A = [1 6 3 5 7 9 12], plot(X, A,'+') |
Matlab interprète le premier vecteur comme celui correspondant à l'axe des abscisses et le second vecteur comme celui correspondant à l'axe des ordonnées.
Exemple : A = [1 6 3 5 7 9 12]; B = [2 3 8 3 6 4 8]; hold on Plot(A,'+-'), plot(B,'o-') |
Exemple : A = [1 6 3 5 7 9 12]; B = [2 3 8 3 6 4 8]; subplot(2,1,1), plot(A,'+-') subplot(2,1,2), plot(B,'o-') |
nn Si on veut afficher un vecteur A et un vecteur B sur une même fenêtre, il faut activer le mode hold dans l'éditeur de commande en tapant: hold on (par défaut, ce mode est à off).
nn Si on veut afficher un vecteur A et un vecteur B sur une fenêtre séparée en 2 sous fenêtres, il faut utiliser la commande subplot.
c) Labels, grilles et légendes :
En mode de commande, on peut paramétrer les propriétés d'un graphique :
nnpour mettre un label sur l'axe des x : xlabel('texte à afficher') nnpour mettre un label sur l'axe des y : ylabel('texte à afficher') nnpour mettre un titre à la figure : title('texte à afficher')
nnpour rajouter un quadrillage : grid on
nnpour afficher une légende : legend('courbe 1','courbe 2'…)
|
d)Création, fermeture des figures nn Pour créer une nouvelle figure : figure ou figure(num_de_figure) nn Pour effacer la figure courante (en la laissant ouverte): clf (clear figure)
nn Pour fermer une figure : nn close : efface la figure courante nn close(num_de_figure) : ferme la figure de num_de_figure nn close all : ferme toutes les fenêtres ouvertes
NB : A sa création, une figure est associée à un identifiant (handle) défini par matlab. Pour récupérer l'identifiant de la figure courante : gcf
e) Enregistrement des figures nnPour sauver une figure, il existe deux possibilités:
1. Mode interactif : aller dans la fenêtre associée à la figure et cliquer sur >fichier>enregistrer sous puis rentrer le type de format de sortie de la figure:
qqFormat graphique simple (bmp, jpg, tiff…)
qqFormat matlab (.fig) qui permettra de retravailler la figure à posteriori si besoin
2. Mode commande : rester dans la fenêtre d'éditeur de commande et taper saveas(gcf, 'nom_du_fichier', 'type_de_fichier_de_sortie').
Exemple: saveas(gcf, 'figure_cv','fig') permet de sauver la figure courante (gcf) en format Matlab
f) Exercice :
EX 4 : Visualisation d'un signal sinusoïdal de fréquence f = 100 Hz, échantillonné à 20 kHz pendant 10 secondes 1 - Générer un vecteur t contenant les dates en secondes des échantillons d'un signal de durée 10 sec et échantillonné à 20 kHz. 2 - Calculer les valeurs du signal sinusoïdal grâce à la formule : y = sin(2*pi*f*t). 3 - Afficher le signal y en fonction du temps en marquant d'une croix les valeurs des échantillons. 4 - Placer sur le graphique un titre, des labels d'abscisses et d'ordonnée. |
Récapitulatif de la leçon 1:
qqSuite à la leçon 1 vous devez savoir :
nnGénérer un vecteur allant de 1 à 100 par pas de 2 : A = 1:2:100 nnPrélever dans un vecteur un échantillon tous les 3 échantillons : B =
A(1:3:end); nnAdditionner 2 matrices A et B de mêmes dimensions : C = A+B nnMultiplier 2 matrices A et B de même dimension terme à terme : C = A.*B; nnTransposer une matrice : B = A';
nnGérer de façon simple les chaînes de caractères nnGénération et manipulation de graphiques
qqLa leçon 2 va aborder les thèmes suivants :
nnProgrammes et fonctions nnBases de programmation
nnUn programme matlab est une suite d'instructions enregistrées dans un fichier texte ayant l'extention '.m'.
nnDans un programme, chaque instruction est effectuée ligne par ligne comme si elle était tapée dans la fenêtre d'édition de commande.
nnToutes les variables utilisées par le programme sont disponibles dans la fenêtre d'éditeur de commande.
nnPour exécuter un programme, Matlab doit pouvoir le localiser. Pour cela il existe la variable d’environnement path. C’est l’ensemble de tous les emplacements des dossiers susceptibles de contenir des fichiers « .m ».
nnPar défaut, Matlab cherche si le programme à exécuter est situé dans le répertoire courant. S’il ne le trouve pas, il cherche dans tous les dossiers spécifiés dans la variable path. S’il ne le trouve nulle part, il affichera un message d’erreur de type : file not found
nnPour ajouter un répertoire dans la liste du path on peut utiliser la commande addpath()
nnLa structure d'un programme devrait toujours être grosso-modo la suivante
% toto.m!
%-------------------------------------------!
% Description du programme!
% !blablabla!
% ------------------------------------------!
% Variables d'entrée:!
% Mettre ici les variables requises par le programme si besoin!
% Variables de sortie!
% Mettre ici le nom des variables générées par le programme si besoin!
%-------------------------------------------! % Auteur(s), date de programmation, dates de modifs!
!
Lignes de programme! % commentaires sur ce que fait le programme! Lignes de programme!
…
NB : Les lignes commençant par « % » sont des commentaires non interprétés par Matlab mais fort utiles pour comprendre la structure du programme.
Les premières lignes de commentaires sont affichées si on tape dans la fenêtre d'édition de commande: help nom_du_programme.
a) Programmes
Exemple de programme:
Calcul de la moyenne et de l'écart-type d'un vecteur donné. 1. Ouvrir l'éditeur de matlab 2. Ecrire le programme suivant % calc_moy_ec_type % programme calculant la moyenne % et l'écart type d'un vecteur x % Input : % * x : vecteur dont on veut connaître la moy, et l'et. % Output: % * moy, ec_typ : moyenne et écart type de x % C.V. le 10/10/06 moy = mean(x); ec_typ = std(x); 3. Sauver le programme sous le nom que vous voulez, ex: calc_moy_et.m 4. Visualier l'aide de ce programme (help calc_moy_et) 5. Exécuter le programme: calc_moy_et après avoir défini le vecteur x |
nnUne fonction matlab ressemble à un programme matlab. Deux différences cependant : qqLa fonction accepte des variables d'entrée et de sortie lors de son appel dans l'éditeur de commande
qqLes variables utilisées dans la fonction sont indépendantes des variables utilisées dans l'éditeur de commande (on parle de variable locales).
Exemple de fonction : Calcul de la somme de 2 nombres
function y = somme (a,b) %function y = somme (a,b) % calcule la somme de a et b y=a+b
nnUne fonction est souvent utilisée pour réaliser un calcul court, utilisé par un autre programme
nnUne fonction commence toujours par une ligne du type function [Variables de sortie] = nom_de_la_fonction([Variables d'entrée])
nnLa structure d'une fonction devrait toujours être grosso-modo la suivante
! function [Variables de sortie] = toto ([Variables d'entrée])!
! % function [Variables de sortie] = toto ([Variables d'entrée]) !
! % -------------------------------------------!
% Description de la fonction!
% !blablabla!
% ------------------------------------------!
% Variables d'entrée:!
% Mettre ici les variables requises par la fonction si besoin!
% Variables de sortie!
% Mettre ici le nom des variables générées par la fonction si besoin!
%-------------------------------------------! % Auteur(s), date de programmation, dates de modifs!
!
Lignes de programme!
% commentaires sur ce que fait la fonction! Lignes de programme! !! nnL'appel de la fonction dans l'éditeur de commande se fait alors par
[var_out1, var_out2,…] = toto (var_in1, var_in2,…)
Exemple de fonction:
Calcul de la moyenne et de l'écart-type d'un vecteur donné. function [moy,ec_typ] = calc_moy_ec_typ(x)! moy = mean(x);! ec_typ = std(x);! | |
1.? | Enregistrer la fonction ci-dessus (par ex: calc_moy_et_func.m) |
2.? | Dans l'éditeur de commande, créer un vecteur u dont on veut calculer la moyenne et l'écart type. Exemple : u = 1:10; |
3.? | Taper dans l'éditeur de commande : [m, et] = calc_moy_ec_typ(u). Dans ce cas, la variablemprendra le résultat de la moyenne calculée dans la fonction sous lenom de variable localemoy. La variable ec prendra le résultat de l'écart type calculé sous le nom deec_typ. |
4.? | Visualiser la valeur des variables x, moy et ec_typ Les variables x, moy et ec_typ sontlocales.Elles n'existent pas pour l'éditeur de commande.Seules existent les variablesmetet |
EX 5 Renommage de nom de fichier : Soit la variable nom_fich = ''; a) Définir une variable contenant le nom du fichier sans son extension b) Ajouter à cette variable le suffixe '' par concaténation de chaîne de caractère. c) Générer une fonction change_extension qui accepte en variable d'entrée des chaînes de caractère de type nom_de_fichier.extension et qui transforme automatiquement le nom de l'extension (à 3 caractères) en « dat ». La valeur de la sortie étant alors . EX 6 Gestion de matrices de chaines de caractères Générer une variable nom_fich contenant sur 3 lignes 3 noms de fichiers : , , . Que se passe t'il si l'on y concatène la chaîne ''? |
a) Les expressions logiques (ou expressions booléennes).
En français : « Est ce que A est égal à B » « Est ce que A est supérieur à B » « Est ce que A est un vecteur vide » … Expressions dont la réponse est Oui ou Non | Sous Matlab : A==B (noter le double =) A>B (noter le simple >) isempty(A) … Expressions dont la réponse est 1 (oui) ou 0 (non) | |||
Exemples : • 1) a = 2, a == 1? • 2) a = [1 2 3 1 4 6], a==1 ? • 3) a = 'toto', a == 'titi' ? • 4) ? a = [1 2], a== [1 2 3] | NB : Les termes à comparer doivent être de même taille (cas 1 et 3) sinon erreur (cas 4). Exception si l'un des termes est un vecteur de taille 1, dans ce cas Matlab se débrouille (cas 2). | |||
Principales fonctions utilisant des expressions logiques :
qqIf … else …end
If expression logique effectuer actions 1
Exemple: rep = input('Réponse 1 ou 2?'); if rep == 1 disp('Vous avez tapé la réponse 1'); else disp('vous avez tapé la réponse 2') ; end |
else effectuer actions 2 end
L'expression logique a la valeur 0 ou 1: qq si elle vaut 1 alors seule l'action 1 est
effectuée,
qq sinon, seule l'action 2 est effectuée.
qqfind : find(Z) donne les valeurs des numéros d'échantillons du vecteur Z différents de 0
En particulier, si Z est le résultat d'une opération logique (ie un vecteur de 0 ou de 1) , find(Z) donne les numéros d'échantillons pour lesquels cette opération est vraie (ie pour lequel Z =1).
Find est très utilisée pour détecter des seuils sur un signal.
Exemple : A = [1 2 4 5 6] find(A==4) donne le résultat 3 (c'est l'échantillon associé au cas où la condition A==4 est vraie) find (A>2) donne le résultat [3 4 5]; (même principe avec A>2)ech_seuil = min(find (A>2)) donne le résultat 3, (c'est le numéro du 1er échantillon dont la valeur est au dessus du seuil) |
qqStrfind: strfind(s, 'chaîne à chercher dans s') donne la valeur de l'échantillon de s correspondant au début de la chaîne cherchée
Exemple : s = 'toto est un sot'; • strfind(s,'sot') donne le résultat 13 strfind(s,'titi') donne le résultat [] (ensemble vide) • Nom_du_capitaine = 'Archibald Haddock'; ? Pour prélever son prénom et le mettre dans la variable prenom_du_capitaine, on peut aussi faire : Prenom_du_capitaine = nom_du_capitaine(1:strfind(nom_du_capitaine,' ')-1); On aura alors prenom_du_capitaine = 'Archibald' Ici on n'a pas besoin de connaître le nombre de lettres exactes du prénom ou du nom. On prend tout ce qui est avant l'espace pour le prénom. |
b) Les boucles
Elles permettent de répéter un ensemble d'actions pendant un nombre de fois prédéfini.
Sous matlab, il existe 2 types de boucles :
qqLa boucle for…end qqLa boucle while …end nnLa boucle for variable = expression … end
Elle permet de répéter une action utilisant une variable spécifiée après le for. Ex : for i = 1:3 tâche 1 Les tâches peuvent faire appel (ou pas) à la variable i qui vaudra ici :
tâche 2 • 1 lors du 1er passage de la boucle, ?
… • 2 lors du 2nd passage ?
• 3 lors du dernier passage ? end
Exemple : Pour calculer la somme des éléments d’un vecteur x on peut calculer: som = 0; % initialisation for i = 1:length(x) som = som+x(i); end |
nnLa boucle while expression logique … end
Elle permet de répéter une action tant que l'expression logique est vraie.
while i<10 & j>10 Les tâches seront effectuées tant tâche 1
Exemple : Pour calculer la somme du vecteur x comme précédemment som = 0; % initialisation fin = 0; % variable logique qui nous servira à arrêter la boucle While not(fin) som = som+x(i); If i < length(x) i = i+1; else fin = 1; % pour arrêter la boucle end end |
que i sera
tâche 2 inférieur à 10 et j
… sera supérieur à end 10
EX 7 Boucle for et nombre d'or…. 1. Générer un vecteur A de taille 100 dont chaque échantillon A(i) est égal à la somme des 2 échantillons précédents et que A(1) = A(2) = 1: A(1) = 1, A(2) = 1. A(i) = A(i-1)+A(i-2). 2. Afficher sur un graphique la variable r définie par r(i) = A(i)/A(i-1); EX 8 Boucle while Demander à l'utilisateur de donner un nombre entre 0 et 10 (en utilisant la fonction input et le faire recommencer tant que le nombre donné est différent de 8) |
nnSuite à la leçon 2 vous devez savoir :
qqEffectuer des opérations logiques sur des nombres ou des chaînes de caractère qqGénérer des programmes et des fonctions utilisant des boucles for… end ou while… end
nnProgramme de la 3ème séance :
qqGestion des fichiers textes qqOpérations avancées sur les chaînes de caractères
qqTravaux Pratiques
a) Introduction nnUn fichier texte est une suite de caractères enregistrés sur le disque dur de l'ordinateur. nnMatlab utilise le code ASCII ISO LATIN-1 pour coder chaque caractère: un caractère est codé sous la forme d'un nombre de 2 octets (donc choisi parmi 2^16 possibilités). nnSous Matlab, la correspondance entre un caractère et son code ascii se fait simplement par les commandes double ou char.
qqExemple: nnle code ascii du caractère 'a' est donné par double('a'). nnle caractère « a » correspondant au code ascii 98 est obtenu par char(98). |
b) Retour sur la gestion des chaînes de caractères nnformatage de chaînes :
En plus de la concaténation de chaînes avec [] ou strcat(), il existe des outils qui permettent d'intégrer dans une chaîne de caractères des données de tout types (nombres à virgule flottante, entier,…). C'est ce que permet la commande sprintf.
nnEcriture de chaînes formatées avec sprintf :
sprintf s'utilise de la manière suivante :
A = sprintf('texte incluant les données d1 : %format-de-d1 et d2 : %format-de-d2 et des caractères spéciaux comme le retour à la ligne \n',valeur de d1, valeur de d2)
NB : Pour qu'une ' soit incluse dans le texte il faut la doubler, sinon matlab l'interprète comme la fin de la ligne de texte et affiche une erreur.
A = sprintf('l''âge du capitaine est %d ans.\n',55);
nnformatage de chaînes (suite):
Le type de données intégrées à la chaîne est précisé avec le symbole %. On peut citer par exemple :
• %f : float (plus généralement avec a = nombre minimum de chiffres à afficher, b: nombre de décimales à afficher)
• %d : entier (plus généralement %.ad avec a = nombre minimum de chiffres à afficher, remplit de 0 si l'entier contient moins de chiffre que a)
• %c : char
• %s : string of char
qq? | Exemple : qqa = sprintf('0+0 = %f',3) qqa = sprintf('0+0 = %s','la tête à toto') qqa = sprintf('toto a %d amis qui s''appellent %s et %s',2, 'titi', 'tutu') |
NB: '' le caractère % étant réservé au formatage, si l'on souhaite l'inclure dans une chaîne formatée, il faut utiliser %%
nnformatage de chaînes (fin):
qqExemple : qqsprintf('le résultat est \n\ta = 2\n\tb=2') |
En plus des données formatées utilisant le caractère %, on peut inclure dans les chaînes formatées certains 'caractères' spéciaux comme le retour à la ligne, la tabulation… :
nn\t : tabulation nn\n : nouvelle ligne nn\r : retour charriot
nnLecture de chaînes formatées :
Pour lire des chaînes contenant différents type de données on peut utiliser la fonction strread.
Supposons qu'une chaîne de caractères A contienne les données suivantes : nom_de_fichier valeur_1 valeur_2 avec :
nnnom_de_fichier : chaîne de caractères, nnvaleur_1 : float
nnvaleur_2 : entier
On peut alors récupérer les valeurs de nom_de_fichier, valeur_1 et valeur_2 de A par la commande strread : [nom_fich, v1, v2] = strread(A,'%s%f%d')
Exemple : a = ' 2.34 4'; (équivalent à a = sprintf('%s %f %d', '', 2.34, 4)) [nom_de_fichier,val1,val2] = strread(a,'%s%f%d') NB : la variable nom_de_fichier n’est pas de format char mais de format cell (cellule). Pour la convertir en char il faut faire : nom_de_fichier = char(nom_de_ficher) |
c) Ouverture/ Fermeture d'un fichier texte
nnOuverture en lecture d'un fichier nommé :
fid1 = fopen('','rt')
Le fichier est ouvert en lecture.
NB : fid1 est l'identifiant du fichier texte ouvert. On peut ouvrir simultanément plusieurs fichiers (en lecture et/ou écriture à condition de définir pour chacun un nom d'identifiant différent.
nnOuverture en écriture d'un fichier :
fid2 = fopen('','wt')
Le fichier est ouvert en écriture
nnFermeture du fichier : fclose(fid).
Penser à toujours fermer un fichier en fin de manipulation!!!
nn? | La lecture d'un fichier se fait de façon cursive : les caractères ou les lignes de caractères sont lus à la suite les uns des autres. |
nn? | Lecture d'un caractère : nnfread(fid,1,'char') : donne le code ascii du caractère courant nnfscanf(fid,'%c',1) : donne le caractère courant |
nn? | Lecture d'un ensemble de n caractères |
d) Lecture d'un fichier texte
nnfread(fid,n,'char) nnfscanf(fid,'%c',n)
nn? | fgetl(fid) : Lecture de la ligne courante du fichier |
d) Lecture d'un fichier texte
Test pour savoir si le curseur est à la fin du fichier : feof(fid)
feof(fid) = 1 si l'on a atteint la fin du fichier
feof(fid) = 0 sinon
Exemple : Lecture de chaque ligne d'un fichier jusqu'à la fin du fichier while not(feof(fid)) l = fgetl(fid); end |
d) Lecture d'un fichier texte
nnLecture d'une suite de caractères et/ou de nombres disposés en colonnes : qqload : Si les données ne contiennent que des nombres, on peut utiliser la commande load :
S = load('');
qqtextread : Si les données sont des colonnes de nombres et de chaînes de caractères, on peut utiliser la commande textread
Exemple :
Si le fichier contient 3 colonnes de données séparées par un espace : nom (chaîne de caractères) val1 (float) val2 (int), On peut récupérer ces données de la façon suivante :
[nom,v1,v2] = textread('','%s%f%d')
d) Lecture d'un fichier texte
EX 9 Créer avec le bloc-note un texte simulant une suite de données de différents types séparées par des tabulations : qqnom de famille (chaîne de caractères) qqAge (entier) qqnote (nombre flottant) Récupérer ces informations sous Matlab à l'aide des commandes d'ouverture et de lecture de fichiers textes |
e) Ecriture d'un fichier texte nnL'écriture d'un fichier se fait de façon cursive : les caractères ou les lignes de caractères sont écrits à la suite les uns des autres. nnEcriture d'une chaîne de caractères formatée :
nnfprintf(fid,' toto est un sot \n') nnfprintf(fid,'%s %f %f',nom_de_fichier,val1, val2)
e) Ecriture d'un fichier texte
EX 10 : Ecriture de fichier texte Reprendre le fichier texte généré pour l’exercice 9. Lire l’ensemble des notes de chaque élève pour les augmenter d’un point et écrire le nouveau fichier contenant le nom, l’âge et la note modifiée. EX 11 : Lecture de fichiers Texgrids Cf annexes |