IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

[fprintf]ou[save] problème de sauvegarde de matrice dans fichier externe [Débutant]


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut [fprintf]ou[save] problème de sauvegarde de matrice dans fichier externe
    bonjour a tous,

    je suis doctorant et j'utilise matlab pour résoudre des équation de transfères de masse grâce a la loi de fick.

    mon problème vient du fait que je réalise du calcul itératif qui stock mes vecteur (champs de température (100 noeud) ou champ de concentration (idem)) dans une matrice de sauvegarde à chaque pas de temps. celle-ci sert a afficher mes résultats en fin de calcul.

    le problème ce situe dans le fait que mes matrices de stockage de données sont très volumineuse et ralentisse mon calcul (temps de calcul quasi exponentiel avec le temps de simulation).

    je cherche donc a sauvegardé mes matrices de donnée vers un fichier externe types .txt par exemple. pour remplir ce fichier texte tout les "n" nombre de cycle et vidangé mes matrices de sauvegarde.

    l'objectif étant a la fin du calcul de pouvoir rechargé ces fichier contenant la concaténation cyclique de mes matrice de données.

    mon problème c'est que avec fpintf j'arrive a stocker les donnée mais je perds l'information matriciel (plus de différenciation ligne/colonne). mes donnée sont donc inutilisable.

    avec save pas réussi a concaténé dans le fichier .mat les données de la matrice lors des sauvegarde successive.


    voici un morceau de mon code de sauvegarde externe qui est au cœur de ma boucle temporelle qui réalise le calcul de simulation.

    CODE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	if mod(i,100)==0
            disp(sprintf('Temps de simulation : %8.2f s',t(i+1)))
            toc
     
            fid = fopen('Ts.txt','a+');
            fprintf(fid,'%12.8e %12.8e\n',Ts);
            fclose('all');
     
             Ts=[];
            end

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Je te revoie à un sujet qui a été traité il n'y a pas si longtemps
    http://www.developpez.net/forums/d10...fichier-texte/

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Au sujet de l'écriture dans le fichier, je sortirais les fonction d'ouverture et de fermeture de la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    fid = fopen(...,'wt');
     
    for n = ...
     
       fprintf(...)
     
    end
     
    fclose(fid);
    Ensuite, il faudrait en savoir un peu plus sur la quantité de données que tu traites. Quel est le nombre de valeurs stockées au final dans le fichier texte ?

    As-tu envisagé la pré-allocation de mémoire ?
    Voir la : Qu'est-ce que la préallocation de mémoire ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    merci pour ses réponse si rapides,

    je n'ai pas encore eu le temps de tester vue que j'étais en cours ce matin.
    mais pour répondre a la question des quantité de données!!! c'est ça le problème!

    a l'heure actuelles mon programme plante a cause d'erreur mémoire au bout d'une 10ène d'heures simuler car mes matrice de stockage qui pour l'instant n'était pas externalisé sature.

    soit 100*3600/2*10= 1 800 000 données et ceci dans le cas de seulement 100 noeuds sauvegardé toute les deux seconde pendant 10h.

    or dans l'absolus le nombre de nœuds peu augmentés le pas de temps de sauvegarde difficilement baissé et le temps de simulation être multiplier par 4 ou 5.

    mon idée était de stoker mes donnée dans des variable tampon comme je le fait actuellement mais de les transférés a intervalle de temps régulier vers un fichier extérieur pour les vidés.
    le but étant de ne pas avoir a écrire dans le fichier a chaque tour de boucle pour gagner du temps mais peu être est ce la mon erreur et devrais-je supprimé mes variable de stockage de donnée et écrire les résultat de chaque pas de temps directement dans un fichier externe.

    je vais commencer par tester les solution que vous me proposé pour voir ce que ça change.

    encore merci.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    en combinant la solution de Dut dans le liens de Winjerome j'ai fini par obtenir quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            fid = fopen('Ms.txt','at');
            fmt = [repmat('%12.8e ',1,length(M)) '\n'];
            fprintf(fid,fmt,Ms);
     
            fid = fopen('M1s.txt','at');
            fmt = [repmat('%12.8e ',1,length(M1)) '\n'];
            fprintf(fid,fmt,M1s);
     
            fid = fopen('Xms_sav.txt','at');
            fmt = [repmat('%12.8e ',1,length(Xms)) '\n'];
            fprintf(fid,fmt,Xms_sav);
    fclose('all')
    etc au coeur de ma boucle temporelle et seulement tout les X pas de temps.

    cella créer bien des fichier text avec les bonnes données et une structure ligne colonne cohérente.

    je pense donc que ça répond a ma question... sauf que quand j'appelle mon fichier text en fin de programme pour récupéré ma matrice complète avec la fonction fread je récupère des données incohérente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            fid = fopen('Ms.txt','rt')
            Ms=fread(fid);
     
            fid = fopen('M1s.txt','rt')
            M1s=fread(fid);
     
            fid = fopen('Xms_sav.txt','rt')
            Xms_sav=fread(fid);
    fclose('all')
    j'imagine que c'est le même type de problématique c'est a dire un problème dans le format de lecture si quelqu'un a un tuyaux je serai donc preneur.

    quoi qu'il en soit merci pour l'aide précieuse déjà apporté.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 58
    Points : 69
    Points
    69
    Par défaut
    Essaie avec: fscanf.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    merci a force d'acharnement j'ai finie par trouvé un code avec fscanf qui marche en effet très bien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/12/2009, 21h22
  2. sauvegarde des matrices dans un fichier
    Par eemii dans le forum C
    Réponses: 4
    Dernier message: 22/04/2009, 09h28
  3. Réponses: 1
    Dernier message: 06/08/2008, 09h35
  4. problème de sauvegarde et utilisation de fichier
    Par captainamerica75 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 04/06/2007, 10h09
  5. [PDE] Problème pour sauvegarder une modif dans un éditeur
    Par simsky dans le forum Eclipse Java
    Réponses: 11
    Dernier message: 11/08/2005, 15h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo