Matlab en sciences

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je travaille de plus en plus avec Matlab et j'ai du mal avec certaines fonctions que je dois apprendre en sciences. Par exemple pour un exercice, j'ai une matrice dans un tableau de données .mat avec pleins de valeurs (matrice 10x5) et on suppose que ce sont des L que je dois convertir en mL avec un format:

Échantillon Test 1 Test 2 …


1 [Résultats en mL]

2

Je n'ai jamais effectué de travail avec un fichier externe et je ne vois pas comment faire. Sur internet j'ai trouvé la fonction load pour le faire mais je comprends pas comment manipuler le fichier après import. Je pensais faire d'abord l'importation puis une boucle for qui convertit chaque valeur… Mais comment savoir combien de lignes/colonnes j'ai dans mon fichier (faire une analyse du file ?) Et aussi pour faire un tableau du genre comment je fais ? Je dois bidouiller avec des fprintf ? (La grande ligne est censée être des traits ----)

Merci d'avance.

Édité par sotibio

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

Salut,

En te lisant, j'ai du mal à comprendre ce que contient exactement ton fichier. En fait, « un tableau de données .mat », ça ne veut pas dire grand chose. Les fichiers .mat sont simplement une manière pour Matlab d'enregistrer des variables dans un fichier. Le format des données n'est pas non plus très clair.

Si ton fichier contient effectivement une variable Matlab, alors c'est facile. La première chose à faire est effectivement te charger tes données dans l'espace de travail (workspace) avec la fonction load. En exécutant l'instruction load('le_nom_de_ton_fichier');, les variables enregistrées dans le fichier seront chargée dans le workspace. Tu peux ensuite les manipuler comme si tu les avais créées directement dans le workspace.

Si tes données ne sont pas au format Matlab .mat, alors il faudra utiliser une autre fonction. Matlab propose des fonctions pour lire les fichiers CSV (csvread si j'ai bonne mémoire), Excel (xlsread si j'ai bonne mémoire) ou en texte formaté. Tu trouveras plus d'informations dans la documentation de Matlab. Le résultat est le même que load : tu te retrouves avec une variable dans ton workspace.

Maintenant que tu as ta matrice dans ton workspace, tu peux travailler dessus. Matlab est fait pour manipuler des matrices, en général, il n'y a pas besoin de faire des boucles, et il vaut mieux même les éviter, pour des raisons de performance. Dans ton cas, pour changer les litres en millilitres, il suffit de diviser par 1000. Tu feras donc quelque chose du genre matrice_ml = matrice_l / 1000;.

Il manque des détails pour être plus précis, mais l'idée générale est là.

+1 -0
Auteur du sujet

Merci Aabu. J'ai trouvé un autre exercice plus compliqué (j'ai l'impression) qui consiste à convertir des températures mais avec un affichage de villes et d'heures aussi ce qui me fait traiter 3 fichiers qui sont dans le workspace et qui sont des variables et quand j'ouvre les fichiers c'est dans l'esprit d'un tableau Excel. J'ai vu dans le cours d'informatique les cell arrays donc je suppose que c'est ce que je dois utiliser mais je ne les ai pas compris et jamais on prenais des infos d'un fichier externe…Données Matlab

(Exemple de quelques lignes)

Dans ce cas j'ai 5 villes dans un autre fichier qui se trouve dans le workspace (enfin le même fichier de base mais il s'est automatiquement découpé en 3 sous-fichiers quand je l'ai ouvert) ainsi que les différentes heures.

J'avais déjà effectué la commande load('MesuresVillesTemp.mat') [nom du fichier] mais je vois pas comment faire des manipulation avec maintenant.

Mon Workspace:

Workspace

L'affichage me semble aussi compliqué: faire des colonnes et des lignes bien alignées…

D'avance merci.

Édité par sotibio

+0 -0
Staff

J'imagine que la température de la ville i au temps j se trouve en Temperatures[j][i] (vu les tailles de ton tableau). À partir de là, qu'est-ce que tu veux faire de tes données ?

Édité par Gabbro

Hier, dans le parc, j'ai vu une petite vieille entourée de dinosaures aviens. Je donne pas cher de sa peau.

+1 -0
Auteur du sujet

C'est bien ça pour la température. A partir de là, j'aimerais créer un script Matlab qui mette toutes ces valeurs en degrés Kelvin (pour l'entraînement car c'est inutile bien sûr) et qui "les présentes bien" avec tout bien aligné (ville, température, heure) suivant quelque chose comme ça:

Exemple de tableau

J'ai essayé de faire des petites choses mais rien ne va…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
load('DataMesures.mat');

location = DataMesures.Location;
temperatures = DataMesures.Temperatures;
time = DataMesures.Time;

[l, c] = size(location);  %Finding the number of lines and columns for location 
[l1, c1] = size(time);  %Finding the number of lines and columns for time 
fileID = fopen('DataMesures.txt', 'w');
for i=1:c
    fprintf(fileID, '%-30s\t', location{i});
end

for i=1:c1
     fprintf(fileID, '%-30s\t', time{i});
end 
fclose(fileID)

Avec DataMesures le fichier avec toutes les infos (3 tableaux séparés : Heure [1x30], Températures [30x5], Ville [1x5]). Ce sont des fonctions que j'ai trouvé sur la doc Matlab et certains forums (par exemple le %-30s\t mais je comprends pas ce qu'il veut dire.. quelqu'un sait ? )

S'il y a moyen, j'aimerais ne pas écrire dans un fichier .txt mais juste dans la console mais je vois encore moins comment faire (ci-dessus ça me rappelle le C).

EDIT:

Après avoir pas mal lu sur les structures / cellules je commence à mieux comprendre. Je reviens maintenant avec ceci:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
load('DataMesures.mat');

[l, c] = size(Location);  %Finding the number of lines and columns for location 
[l1, c1] = size(Time);  %Finding the number of lines and columns for time 
[l2, c2] = size(Temperatures);

for i=1:c
    fprintf('%-15s\t', Location{1,i})
end

for i=1:c1
     fprintf('%-15d\t', Time(1,i))
end 

for i=1:l2
    for j=1:c2
        fprintf('%-15d\t', Temperatures(i,j))
    end
end

Ce qui fonctionne car tout s'imprime j'ai l'impression mais maintenant comment est-ce que je peux mettre tout ça correctement en page ? Des astuces ? :p

Ca donne ça (j'arrive pas à monter le "bloc" des températures): Villes

(Villes)

Températures

(Températures)

Édité par sotibio

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

Je vois que tu es confus sur le vocabulaire.

Dans ce cas j'ai 5 villes dans un autre fichier qui se trouve dans le workspace (enfin le même fichier de base mais il s'est automatiquement découpé en 3 sous-fichiers quand je l'ai ouvert) ainsi que les différentes heures.

Le workspace ne contient pas de fichiers. Il contient seulement des variables, qui peuvent être de différentes sortes (vector, array, cell array, struct …). Tu peux d'ailleurs voir les variables contenues dans un fichier .mat sans l'ouvrir dans Matlab en cliquant sur le fichier dans l'explorateur intégré à Matlab. Quand tu charges un fichier avec load, tu copies les variables contenues dans le fichier vers le workspace, tu ne charges pas le fichier dans le workspace.

C'est bien ça pour la température. A partir de là, j'aimerais créer un script Matlab qui mette toutes ces valeurs en degrés Kelvin (pour l'entraînement car c'est inutile bien sûr) et qui "les présentes bien" avec tout bien aligné (ville, température, heure) suivant quelque chose comme ça:

Pour la conversion en kelvins, ce sera assez similaire à celle vers les millilitres. Tu peux faire des opérations sur tous les éléments d'une matrice (ou d'un vecteur) assez facilement.

Pour ce qui est de l'affichage, je te déconseille de faire comme ça. La première chose, c'est qu tu vas passer du temps sur des détails inutiles (typiqueement, comment gères tu l'alignement si tes températures prennent beaucoup de chiffres ou peu de chiffres ? Et pour le nom des villes ?). Ce qui serait bien plus intéressant, c'est d'apprendre à tracer des figures avec Matlab. Comme point d'entrée, je te propose de regarder du côté de la fonction plot.

+1 -0
Auteur du sujet

Merci de m'avoir éclairé sur le vocabulaire car effectivement je comprenais pas vraiment ce que je faisais. Ici dans l'exercice on me demande de mettre que 2 décimales donc ça ne pose pas tellement de problèmes sauf à partir de l'heure numéro 10 où on a un léger décalage assez embêtant (voir image ci-dessous). C'est assez moche niveau code je suppose car même pour la ligne en pointillés j'ai mis un simple fprintf('- -') (en boucle pour couvrir toutes les colonnes).

J'ai regardé du côté de la fonction plot que j'ai d'ailleurs déjà utilisé mais dans un autre exercice pour imprimer des graphes de fonctions. J'ai vu ceci qui pourrait être bien. J'ai l'impression que plot n'imprime que des graphes mais je me trompe sûrement.

Shifting Data

Édité par sotibio

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

Plot n'affiche en effet que des graphes. Mais de nos jours, personne ne cherche à faire des choses belles avec du texte brut. Donc soit tu fais des graphes, soit tu fais quelque chose de beau avec Word ou LateX ou autre.

+0 -0
Auteur du sujet

D'accord ;) Merci beaucoup pour toutes tes explications! Si maintenant je voulais créé (ce n'est pas demandé donc je sais pas si c'est possible) un tableau de structures avec toutes les données générés avant (j'ai fais en plus la moyenne et l'écart-type pour voir) avec par exemple DonnéesParVille(1).Location = 'Milano' ou DonnéesParVille(1).min = 'température min ici' comment est-ce que je ferais ? Je pensais exécuter les fichiers créés auparavant et puis faire des boucles pour remplir cette structure mais bon je suis perdu :p

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte