Initiation Matlab 2

Transcription

Initiation Matlab 2
URECA
Initiation Matlab 2
Laurent Ott
Initiation Matlab 2
1
Chaı̂nes de caractères (string)
Une chaı̂ne de caractères (string en anglais) est une suite ordonnée de caractères (du texte, par exemple).
Sous matlab, les chaı̂nes de caractères sont spécifiées entre ’simple quote’, par exemple :
>> ’toto’
>> ’Le resultat est :’
>> ’l’’apostrophe’ %pour mettre une apostrophe il faut doubler la simple quote
1.1
1.1.1
Manipulation des string
Concaténation
L’assemblage de deux ou plusieurs chaı̂nes de caractères s’appelle la concaténation. Un des moyens d’effectuer
une concaténation sous Matlab est d’utiliser les crochet [ ]. Par exemple,
>>
>>
>>
>>
>>
[’Le resultat de ’ , ’la multiplication’ , ’ est donné ci-dessous.’ ]
debut_phrase = ’Le resultat de ’;
fin_phrase = ’ est donné ci-dessous.’;
operation = ’la multiplication’;
phrase_complete = [debut_phrase, operation, fin_phrase]
1.1.2
Extraction d’un morceau de la chaı̂ne de caractères
On peut accéder aux éléments d’une chaı̂ne de caractères de la même manière que pour un vecteur.
>> alphabet = ’abcdefghijklmnopqrstuwxyz’;
>> alphabet(1) % 1ere lettre de l’alphabet
>> alphabet(5:10) % de la 5eme a la 10eme
Si les éléments à extraire sont de taille indéfinie mais séparés par un caractère particulier. On peut diviser
la chaı̂ne de caractères à l’aide de la fonction regexp. Exemple :
>> listeCourse = ’tomates 300gr,radis 200gr,beurre 250gr’;
on divise la chaı̂ne au niveau des virgules
>>
>>
>>
>>
splittedList = regexp(listeCourse, ’,’ , ’split’ );
splittedList{1}
splittedList{2}
splittedList{3}
on peut également spécifier plusieurs séparateurs entre crochet (\s est le caractère spécial pour l’espace)
>> splittedList2 = regexp(listeCourse, ’[,\s]’ , ’split’ )
1
URECA
1.1.3
Initiation Matlab 2
Laurent Ott
Tests sur les chaı̂nes de caractères
On utilisera la fonction ischar pour vérifier qu’une variable contient bien une chaı̂ne de caractères :
>>
>>
>>
>>
a = ’1’;
ischar(a) %vrai
a = 1;
ischar(a) %faux
On utilisera la fonction isempty pour vérifier qu’une chaı̂ne n’est pas vide (fonctionne également sur les
tableaux numériques) :
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
a = ’abcd’;
ischar(a) %oui
isempty(a) %non
a = ’’;
ischar(a) %oui
isempty(a) %oui
a = [];
ischar(a) %non
isempty(a) %oui
a = [1,2];
ischar(a) %non
isempty(a) %non
La fonction strcmp permet de comparer deux chaı̂nes de caractères. Elle retourne 1 (vrai) si les deux chaı̂nes
sont identiques et 0 (faux) sinon.
>>
>>
>>
>>
>>
>>
strcmp( ’toto’, ’toto’) %vrai
strcmp( ’toto’, ’titi’) %faux
str1 = ’toto’; str2 = ’tutu’;
strcmp(str1, str2) %faux
strcmp(str1, ’toto’) %vrai
strcmp(str2, ’toto’) %faux
1.2
Conversion nombre <-> chaı̂ne de caractères, et vice versa
La fonction str2num permet de convertir une chaı̂ne de caractère représentant un nombre en une variable
numérique.
Exemple :
>> a = ’1234.56’;
>> a * 3
ne donne pas (1234.56 * 3) car a n’est pas une variable numérique mais une chaı̂ne de caractère
>> b = str2num(a);
>> b * 3 %ok
2
URECA
Initiation Matlab 2
%d
nombres entiers
%f
notation standard d’un nombre réel
%e
notation exponentielle
Laurent Ott
Il est également possible de réaliser l’opération inverse. La fonction num2str(num,format) convertit une
variable numérique en chaı̂ne de caractère. La chaı̂ne de caractère format permet de choisir la notation utilisée
pour représenter le nombre (notation standard avec séparateur décimal, notation exponentiel, ...).
On peut également spécifier le nombre de caractère minimal servant à la représentation du nombre et la
précision après le séparateur décimal.
Testez les exemples suivants :
>>num2str(23,’%d’)
>>num2str(23,’%f’)
>>num2str(23,’%e’)
>>num2str(4/3,’%f’)
>>num2str(4/3,’%e’)
>>num2str(23,’%05d’) %représentation sur 5 caractères avec rajout de 0 à gauche
>>num2str(4/3,’%010.2f’) %représentation sur 10 caractères avec 2 chiffres
%après la virgule et rajout de 0 à gauche si nécessaire
2
Récupérer une valeur au clavier
Par le biais de la fonction input, on peut demander à l’utilisateur d’entrer des données numériques au
clavier. La forme de la fonction est la suivante :
x = input(prompt_string)
x est la variable qui contiendra la valeur donnée par l’utilisateur et prompt_string est une chaı̂ne de
caractères pour informer l’utilisateur sur la requête.
>>num_sujet = input(’Veuillez entrer le numéro du sujet :\n’)
Veuillez entrer le numéro du sujet :
23
num_sujet =
23
La fonction input permet également de récupérer une chaı̂ne de caractères en ajoutant en deuxième argument
’s’.
>>nom_sujet = input(’Veuillez entrer le nom du sujet :\n’,’s’)
Veuillez entrer le nom du sujet :
toto
nom_sujet =
toto
3
URECA
3
Initiation Matlab 2
Laurent Ott
Travailler avec des fichiers
3.1
Chemin relatif/absolu
Un chemin est une chaı̂ne de caractères désignant un lieu (fichier ou répertoire) unique de l’arborescence
d’un système de fichier. Le lieu est spécifié par une suite de nom de répertoire (puis finissant éventuellement
par un nom de fichier) séparé par un délimiteur dépendant du système d’exploition (slash ’/’ sous unix (Mac,
linux, ...), backslash ’\’ sous windows).
Un chemin absolu décrit la position d’un fichier ou répertoire depuis la racine du système de fichier.
Exemple sous windows : C:\Windows\System32\kernel32.dll donne la position du fichier kernel32.dll à savoir
dans le répertoire System32 lui-même situé dans le répertoire Windows à la racine du lecteur C.
Exemple sous linux : /home/user/devel/mon_prog.c donne la position du fichier mon prog.c
On peut également localiser un fichier en donnant sa position relative par rapport au répertoire courant
(voir section suivante), on parle dans ce cas de chemin relatif. Le . permet de désigner le répertoire courant,
et le .. le répertoire parent. Par exemple :
.\data\acq1.txt designe le fichier acq1.txt présent dans le répertoire data situé dans le répertoire courant.
Exercice : Si le répertoire courant est C:\mesXP\superXP, donner le chemin absolu du fichier spécifié à
partir du chemin relatif suivant ..\autreXP\data\acq1.txt
3.2
Le répertoire courant (Current Folder)
Le répertoire courant est un lieu de référence que Matlab utilise pour trouver des fichiers. Ce répertoire
est aussi parfois appelé répertoire de travail (working directory).
Le répertoire courant est visible et peut-être modifié directement sous la barre de menu ou en ligne de
commande avec cd.
Vous pouvez toujours charger des fichiers ou exécuter des scripts et fonctions se trouvant dans le répertoire
courant, et ce même si ce répertoire ne fait pas partie du chemin de recherche (search path) 1 .
De plus, lorsqu’une fonction est présente dans le répertoire courant, celle-ci est exécutée en priorité même
si une fonction de même nom se trouve dans le chemin de recherche de Matlab.
3.3
Lister le contenu d’un répertoire
La fonction dir permet d’obtenir une liste du contenu (fichiers et/ou autres répertoires) d’un répertoire.
Par exemple, pour lister le contenu du répertoire parent au répertoire courant
>>list = dir(’..’)
renvoie un tableau de structures (ici nommé list). Chaque élément du tableau est une structure contenant
une chaı̂ne de caractères donnant le nom de l’élément (par ex pour le 3ème élément, >>list(3).name ), la date
de modification (>>list(3).date), la taille en octets (>>list(3).bytes), un booléen égale à 1 si l’élément est
un répertoire et à 0 sinon (>>list(3).isdir).
Exercice : à l’aide de la fonction dir et d’une boucle for, afficher le contenu du répétoire C :\windows
(pour ceux sous linux, afficher le contenu du répertoire /etc).
1. Le chemin de recherche ou search path est un ensemble de répertoires que Matlab utilise pour trouver les fichiers utiles (par
exemple, certaines toolbox sont un ensemble de fichiers de fonction regroupés dans un même répertoire situé dans le search path de
Matlab)
4
URECA
Initiation Matlab 2
Laurent Ott
Figure 1 – fichier grades.dat (source : documentation Matlab)
3.4
Autres fonctions utiles
cd : changer le répertoire courant
fileparts : sépare un chemin en noms de répertoire et de fichier
fullfile : construit un chemin à partir de noms de répertoire et de fichier
isdir : détermine si la chaı̂ne de caractère correspond à un chemin vers un répertoire
movefile : déplacer un fichier vers un autre répertoire
mkdir : créer un répertoire
delete : supprimer un fichier
rmdir : supprimer un répertoire
3.5
3.5.1
Importer/exporter des données à partir/vers des fichiers texte
Import
La manière la plus simple d’importer des données sous Matlab à partir de la ligne de commande et d’employer
la fonction importdata.
Pour la plupart des fichiers, importdata est capable de détecter automatiquement :
— Les en-têtes des lignes et colonnes,
— Les séparateurs (caractères entre les données comme les virgules, les espaces, les tabulations ou les points
virgules).
— Les commentaires Matlab (lignes commençant par un signe pourcent %)
Par exemple, importdata peut facilement importer un fichier de la forme suivante :
Exemple : Créer le fichier grades.dat et essayer de l’importer avec importdata
>>grades_imp = importdata(’grades.dat’);
Le fichier contient à la fois des en-têtes de lignes et de colonnes, importdata renvoie alors une structure
grades_imp de la forme suivante :
>>grades_imp
grades_imp =
data: [4x3 double]
textdata: {6x1 cell}
>>grades_imp.data
grades_imp.data =
85
90
95
90
92
98
5
URECA
100
77
Initiation Matlab 2
95
86
Laurent Ott
97
93
>>grades_imp.textdata
grades_imp.textdata =
’Class Grades for Spring Term’
’
Grade1 Grade2 Grade3’
’John’
’Ann’
’Martin’
’Rob’
Pour que importdata fonctionne correctement, il faut que les données dans le fichier soit rectangulaire
(comme une matrice), i.e. avec le même nombre de données sur chaque ligne.
Exercice : Créer un fichier grades2.dat reprenant les données du fichier grades.dat en retirant toutes les
en-têtes puis importer les données sous matlab avec importdata, observer le contenu de la variable renvoyé
par importdata.
3.5.2
Export
Si vous souhaitez utiliser vos données dans d’autres applications lisant les fichiers ASCII (excel, SPSS),
Matlab dispose de plusieurs fonctions d’export de données au format texte. Il est, par exemple, très simple de
créer un fichier texte rectangulaire avec délimiteur depuis une matrice M en utilisant la fonction dlmwrite.
Plusieurs façons de l’utiliser :
dlmwrite(filename,
dlmwrite(filename,
dlmwrite(filename,
dlmwrite(filename,
M)
M, ’delimiter’, D )
M, ’-append’)
M, ’-append’, ’delimiter’ , D
)
Par défaut, le délimiteur employé par dlmwrite est la virgule. Il est cependant possible de spécifier un autre
délimiteur avec l’option ’delimiter’ en remplaçant D par le délimiteur de son choix (par ex : ’\s’ pour un espace,
’\t’ pour une tabulation, ’ ;’ pour un point virgule). L’option ’-append’ permet d’ajouter les données à la fin du
fichier. Si l’option n’est pas spécifiée dlmwrite écrase le fichier.
Quelques exemples :
>> t = 0:0.1:10;
%vecteur de temps
>> signal = sin(2*pi*t/10); % ces 2 vecteurs sont des vecteurs en ligne
>> A = [t’, signal’]; %on crée une matrice A, l’operateur ’ permet
%de convertir les vecteurs ligne en vecteurs colonne
>> dlmwrite(’monfichier1.dat’, A);
>> dlmwrite(’monfichier2.dat’, A, ’delimiter’, ’\s’)
>> dlmwrite(’monfichier2.dat’, A, ’-append’ ,’delimiter’, ’;’)
Après chaque appel à dlmwrite, regarder le contenu du fichier correspondant.
3.5.3
Les accès bas-niveau aux fichiers
Matlab offre également des fonctions d’accès bas-niveau aux fichiers proches de celles disponibles en langage
C. Leurs fonctionnements ne seront pas détaillées ici. Mais à titre indicatif :
6
URECA
—
—
—
—
—
—
—
—
4
Initiation Matlab 2
Laurent Ott
fopen : ouverture d’un fichier
fclose : fermeture d’un fichier
fread : lecture ds un fichier binaire
fwrite : écriture ds un fichier binaire
fprintf : écriture ds un fichier texte
fscanf : lecture ds un fichier texte
fseek : se déplacer dans un fichier
fgetl, fgets : Lire une ligne ds un fichier ss le caractère de fin de ligne et avec
Application
4.1
Extraction d’indices sur des données cinématiques
Téléchargez l’archive à l’adresse suivante
http://ureca.recherche.univ-lille3.fr/ott/Matlab_s2_data.zip et décompressez la dans votre répertoire
de travail.
Dans le répertoire data extrait, on dispose de fichiers contenant des acquisitions sur tablette graphique. Les
noms des fichiers sont de la forme suivante : COND1 [num sujet].dat et COND2 [num sujet].dat. Ouvrez l’un
des fichiers à l’aide d’un éditeur de texte : sur chaque ligne, on trouve 3 valeurs séparées par des espaces. La
première valeur correspond au temps (en seconde), les 2ème et 3ème valeurs sont respectivement la position en
X et la position en Y (en cm) du stylet sur la tablette graphique.
Exercice : Ecrire le script qui, pour chaque sujet, va calculer
- le temps de réaction (TR) (avec un seuil de vitesse de 5mm/s)
- l’amplitude du pic de vitesse
- et le temps pour l’atteindre (temps entre le début du mouvement et le pic de vitesse).
On souhaite avoir le résultat dans un fichier COND1.txt (respectivement COND2.txt) qui aura sur chaque
ligne : le numéro du sujet, le TR, l’amplitude du pic et le temps pour l’atteindre séparés par des espaces.
1ère étape : Calcul des indices sur 1 seul fichier
— Faire un premier script qui ira importer les données d’un fichiers (par ex COND1 1.txt) dans une
variable nommée data.
— Stocker séparément chaque colonne de data dans 3 nouvelles variables T, X, Y.
— Calculer le vecteur des vitesses. On peut prendre velX(i) = X(i)−X(i−1)
T (i)−T (i−1) , idem pour Y. On calcule
p
ensuite la vitesse absolue velAbs(i) = velX(i)2 + velY (i)2 . (plusieurs solutions envisageables :
utilisation de boucles, utilisation de la fonction diff et de l’opérateur . pour effectuer des opérations
terme à terme entre vecteurs ( ./ pour la division, .* pour la multiplication, .^ pour élever à la
puissance)).
— Trouver le premier élément du tableau velAbs supérieur au seuil de vitesse de 5mm/s et sa position
temporelle. Cette position temporelle nous donne le TR.
— Trouver le maximum de velAbs et sa position temporelle (voir l’aide pour utiliser judicieusement
les valeurs de retour de la fonction max).
Nous avons à présent toutes les briques pour calculer les 3 indices recherchés.
2ème étape : Automatisation du traitement pour tous les sujets
— Faire un nouveau script
— Utiliser la fonction dir pour récupérer la liste des fichiers du répertoire data
— Mettre en place une boucle pour parcourir la liste de fichiers. Dans cette boucle :
— Tester si le fichier courant est un fichier de données (le nom de fichier contient-il la chaı̂ne de
caractère ’COND1’ ?)
— Extraire le numéro de sujet du nom de fichier (fonction regexp(... , ... , ’split’ ))
7
URECA
Initiation Matlab 2
Laurent Ott
— Importer le fichier de données (fonction importdata )
— Calculer les indices en réutilisant ce qui a été fait dans le premier script
— Sauver les résultats dans le fichier COND1.txt (respectivement COND2.txt) avec le bon format
(fonction dlmwrite).
Afin de comparer visuellement la distribution des TR pour chaque condition, nous allons tracer une
figure contenant un histogramme des TR pour chaque condition.
%%%%%%%%%%%%
%import des indices cinématiques
cond1_res = importdata(’COND1.txt’);
cond2_res = importdata(’COND2.txt’);
TR1 = cond1_res(:,2);
TR2 = cond2_res(:,2);
%calcul des histogrammes avec la fonction hist
nbins = 20;
[ TR1_count , TR1_bins ] = hist(TR1 , nbins);
[ TR2_count , TR2_bins ] = hist(TR2 , nbins);
%création d’une nouvelle figure
figure,
%on maintient l’affichage pour superposer plsusieurs courbes
hold on,
%en bleu pour la condition 1
bar( TR1_bins , TR1_count , ’b’ );
%en rouge pour la condition 2
bar( TR2_bins , TR2_count , ’r’ );
%legende, titre d’axes et titre de figure
legend( ’COND1’ , ’COND2’ );
xlabel( ’Temps de Réaction’ );
ylabel( ’Fréquence’ );
title( ’Distribution des TR’ );
%%%%%%%%%%%
Faites de même pour les 2 indices restants.
8

Documents pareils