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 :

Interruption d'un programme et sauvegarde de données [Débutant]


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juin 2007
    Messages : 40
    Points : 34
    Points
    34
    Par défaut Interruption d'un programme et sauvegarde de données
    Bonjour,

    Le but de mon programme est de calculer des matrices de constantes de rpopagation. Le calcul est très long et les matrices recherchées sont grandes.
    J'ai développé une interface GUI qui me permet de lancer le calcul de ces constantes et d'interrompre le programme quand bon me semble (je peux bien sur reprendre mes calculs quand je le veux). Toute cette partie marche très bien.
    Le problème survient par exemple quand il y a une coupure de courant ou un problème sur l'ordinateur ce qui fait que mon application Matlab se ferme et mes données que j'ai calculées pendant des semaines sont perdues... Il me faudrait alors insérer une condition dans le programme qui me permettrait de dire "Voilà, si je veux fermer Matlab ou si Matlab s'arrete, enregistre moi les constantes déjà calculées et quand je souhaite reprendre le calcul, il me reprend les calculs là où il s'est arrêté."

    Est ce possible de faire une telle chose sous Matlab sachant que je travaille avec des matrices?

    En vous remerciant à l'avance,

    Vanessa

  2. #2
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    Le plus simple serait de combiner les fonction diary et save.
    Lance diary avant de lancer ton code, et insère la commande save dans le code ainsi tes données seront sauvegardées dans un MAT-file. Si MATLAB plante, tu ouvres ton fichier diary, comme ça tu vois où MATLAB s'est arrété et avec la foncton load tu récupères tes données.
    regarde ce lien
    et notamment le chapitre Exporting Data from MATLAB.
    Il te donne toutes les solutions possibles comme diary, save, fopen...
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juin 2007
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    C'est peut être bete mais je ne vois pas trop comment utiliser la fonction diary.
    En effet, j'ai une boucle dans mon programme qui me calcule ces constantes de propagation. Mon souci est que lorsque le programme s'interrompt en plein dans la boucle, comment créer cette fonction diary, donc comment sauvegarder les données et reprendre les calculs là où s'est arrêté le programme?

    Merci d'avance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
     
     
    %------------------ Constants and initialisation ------------------%
     
    warning off MATLAB:divideByZero;
    % warning off MATLAB:fzero:UndeterminedSyntax;
    options = optimset('TolFun',1e-12);
    Lamb_mean = 630e-9;
     
    %************ Calcul de la frequence, du nombre de mode et du groupe de mode******************%
     
    ON = 0.26;
    d_co = 250e-6;
     
    while (ON <= 0.50)
     
    n_cl= sqrt(n_co^2 - ON^2);
    V = (2 * pi / Lamb_mean) * (d_co / 2) * sqrt(n_co^2 - n_cl^2)
    N_modes = 0.5 * V^2
    M_modes = sqrt(N_modes)
    k0 = k0_mean;
     
    %******************************************************************%
     
     
    %************ Sauvegarde du fichier FibreData            ******%
    %************ dans un sous répertoire dont               ******%
    %************ dont la valeur est celle du rayon de coeur ******%
     
    NomRepertoire = ['.\Results\', num2str(d_co)];
    mkdir(NomRepertoire);
    repertoire = strcat (NomRepertoire,'\FibreData_', num2str(V),'.mat');
    repertoire2 = strcat (NomRepertoire,'\FibreData_', num2str(V),'.txt');
    save  (repertoire, 'd_co', 'd_cl', 'd_ct', 'ON', 'n_co', 'n_cl', 'Lamb_mean', 'k0_mean');
    save (repertoire2, 'd_co', 'd_cl', 'd_ct', 'ON', 'n_co', 'n_cl', 'Lamb_mean', 'k0_mean', '-ASCII', '-DOUBLE','-TABS'); 
    %******************************************************************%
     
    %------------------ Search for cut off normalised frequencies -----%
     
    dBeta = (n_co - n_cl) * k0 / (20 * floor(N_modes * 1.2));
    Interv = [];
    Beta_array = [];
    inter = strcat (NomRepertoire,'\Interv_', num2str(V),'.mat');
    save(inter,'Interv'); 
     
    BetaMin = k0 * n_cl
    BetaMax = k0 * n_co
    BetaLength = BetaMax - BetaMin;
    nu = 0;
    ZeroFound = 1;
    Beta = BetaMin;
    h0 = waitbar(0,['% of orders processed']);
    set(h0,'Name','Order');
     
    BarPosit = get(h0,'Position');
    while ZeroFound == 1
        i = 1;
        ZeroFound = 0;
     
        pause(0.01); % 0.01 A CHANGER SI TEMPS DE CALCUL PAS CONVENABLE 
     
        waitbar(nu/M_modes,h0);
        h1 = waitbar(0,['Order ',num2str(nu),' : search of root segments in progress'],'Position',(BarPosit + [100 -100 0 0]));
        set(h1,'Name','Search of roots segments in progress');
     
        while Beta <= BetaMax
            waitbar((Beta-BetaMin)/BetaLength,h1);
            Disp1 = gDispersion(Beta,nu,k0,n_co,n_cl,d_co,J_bess,K_bess);
            Disp2 = gDispersion(Beta + dBeta,nu,k0,n_co,n_cl,d_co,J_bess,K_bess);
            Disp3 = gDispersion((Beta + 2 * dBeta),nu,k0,n_co,n_cl,d_co,J_bess,K_bess);
            if (isfinite(Disp1) & isfinite(Disp2) & isfinite(Disp3)) & (sign(Disp2) ~= sign(Disp1)) & (sign(Disp3 - Disp2) == sign(Disp2 - Disp1))
                Interv((nu+1),i,1) = Beta;
                Interv((nu+1),i,2) = Beta + dBeta;
                i = i + 1;
                ZeroFound = 1;
            end
            Beta = Beta + dBeta;
        end
        close(h1);
        Beta = BetaMin;
        if ZeroFound == 1
     
            save(inter,'Interv','-APPEND');
            nu = nu + 1;
        end
    end
    close(h0);
     
    h = waitbar(0,'Roots search in progress');
    Betas = [];
    Size2 = length(Interv(1,:,1));
    for i = 1:nu
        waitbar(i/(nu + 1));
        for j = 1:nnz(Interv(i,:,1))
            Betas(i,(Size2 - j + 1)) = fzero(@gDispersion,[Interv(i,j,1) Interv(i,j,2)],options,(i-1),k0,n_co,n_cl,d_co,J_bess,K_bess);
        end
    end
    close(h);
     
    %************ Sauvegarde des valeurs de Beta ********************%
    %************ et de la denière valeur de nu *********************%
     
    beta = strcat (NomRepertoire,'\Betas_', num2str(V),'.mat');
    beta2 = strcat (NomRepertoire,'\Betas_', num2str(V),'.txt');
    % nu = strcat ('..\Results\',date,'\DerniereValeurDeNu_',num2str(V),'.mat');
    save  (beta, 'Betas');
    save (beta2, 'Betas','-ASCII', '-DOUBLE','-TABS'); 
    % save  (nu, 'DerniereValeurDeNu');
    %******************************************************************%
     
     
     
    % % Test pour tracer la courbe de dispersion
    % % ValeurBeta    = (n_cl * k0):((n_co - n_cl) * k0 / 1000):(n_co * k0);
    % % figure (1)
    % % hold on
    % % for i=1:nu
    % % plot (ValeurBeta,gDispersion(ValeurBeta,i,k0,n_co,n_cl,d_co,J_bess,K_bess)); 
    % % end
    % % hold off
    % % ******************************************************************%
     
    %************ Calcul des valeurs de Kappa***********************%
    Kappas = [];
    Kappas = sqrt((n_co * k0)^2 - Betas(1,:).^2);
    for i = 2:nu
        if nnz(Betas(i,:)) == length(Betas(i,:))
            Kappas = [Kappas; sqrt((n_co * k0)^2 - Betas(i,:).^2)];
        else
            Kappas = [Kappas; [zeros(1,length(Betas(i,:)) - nnz(Betas(i,:))), sqrt((n_co * k0)^2 - nonzeros(Betas(i,:)).^2)']];
        end
    end
    %************ Sauvegarde des valeurs de Kappa*******************%
    kappa = strcat (NomRepertoire,'\Kappas_', num2str(V),'.mat');
    kappa2 = strcat (NomRepertoire,'\Kappas_', num2str(V),'.txt');
    save  (kappa, 'Kappas');
    save (kappa2, 'Kappas','-ASCII', '-DOUBLE','-TABS'); 
    %***************************************************************%
     
     
    %************ Calcul des valeurs de Gamma***********************%
    Gammas = [];
    Gammas = sqrt((Betas(1,:)).^2 - (n_cl * k0)^2);
    for i = 2:nu
        if nnz(Betas(i,:)) == length(Betas(i,:))
            Gammas = [Gammas; sqrt(Betas(i,:).^2 - (n_cl * k0)^2)];
        else
            Gammas = [Gammas; [zeros(1,length(Betas(i,:)) - nnz(Betas(i,:))), sqrt(nonzeros(Betas(i,:)).^2 - (n_cl * k0)^2)']];
        end
    end
    %************ Sauvegarde des valeurs de Gamma**********************%
    gamma = strcat (NomRepertoire,'\Gammas_', num2str(V),'.mat');
    gamma2 = strcat (NomRepertoire,'\Gammas_', num2str(V),'.txt');
    save  (gamma, 'Gammas');
    save (gamma2, 'Gammas','-ASCII', '-DOUBLE','-TABS'); 
    %******************************************************************%
     
    ON = ON + 0.02;
     
    end

  4. #4
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    avant de lancer ce code , tapes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    diary ma_sauvegarde.txt
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juin 2007
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Je ne comprends pas très bien ce que vous voulez
    Est ce que vous voulez que j'écrive un mini programme de nom "ma_sauvegarde.m" et dans mon programme principal je fais un appel à ce fichier?

    Ou le mettre dans le programme principal?

    Je suis un peu perdue quant à cette partie.
    Merci à l'avance

  6. #6
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    Ok dejà essayer juste d'utiliser la fonction diary.
    Vous tapez dans MATLAB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    diary ma_sauvegarde.txt
    plot(1:10)
    a=rand(3)
    disp('bonjour')
    diary off
    maintenant si vous tapez:
    MATLAB va vous retourner:
    plot(1:10)
    a=rand(3)
    a =
    0.553675373945444 0.537343620020450 0.868439828567106
    0.599456001615582 0.410536157910699 0.570987985798431
    0.281915706771979 0.334607477786544 0.802493548436237
    disp('bonjour')
    bonjour

    diary off
    Donc tout ce qui a été calculé a été sauvegardé dans le fichier spécifié en argument de diary

    voilà pour plus d'infos:
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juin 2007
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Ok. J'ai fait des propres petits tests avec cette fonction de mon cote et au vue des résultats, et de ce que vous m'avez écrit, tout concorde et je vais essayer de transmettre ca à mon programme principal.

    Merci beaucoup de vos réponses et bon week end

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

Discussions similaires

  1. Sauvegarder les données d'un programme
    Par dalfred dans le forum Pascal
    Réponses: 11
    Dernier message: 24/11/2012, 16h38
  2. [Association] Programme de sauvegarde de données
    Par Fred0 dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 24/03/2011, 09h12
  3. [debutant][XML] sauvegarde de donnée provenant de textbox
    Par moust dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 28/06/2005, 15h22
  4. sauvegarde des données des tables
    Par tomm dans le forum Bases de données
    Réponses: 18
    Dernier message: 27/04/2004, 21h29
  5. [Kylix] Sauvegarde de donnée utilisateur....
    Par Eclypse dans le forum EDI
    Réponses: 1
    Dernier message: 11/05/2002, 17h21

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