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 :

Fonction "save" avec variable dynamique


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut Fonction "save" avec variable dynamique
    Bonjour,
    Je viens vous trouver pour avoir un peu d'aide, je souhaiterais sauvegarder une matrice portant un nom choisi par l'utilisateur. Pour cela, j'utilise la fonction "save" mais le problème c'est que je n'ai pas l'impression qu'elle gère les noms de variable dynamique. Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var = inputdlg('Enter variable name','Predicted label',1,{''}); 
    assignin('base', [var{1}], B);
    B est ma matrice. var contient le nom de la variable choisi par l'utilisateur, et j'assigne ensuite le contenu de B dans la variable.
    Par contre, je souhaiterais ensuite faire quelque chose du genre :
    Mais bien évidemment ça ne fonctionne pas car var{1} n'est pas une variable.
    Il faudrait un moyen pour lui faire comprendre que si var contient le nom 'essai' (par exemple), il faut qu'il fasse
    save test essai

    Avez vous une idée?

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    essaie ceci :
    Par contre quel est l'utilité que l'utilisateur choisisse les noms de variables? car d'un point de vus programmation, ce n'est vraiment pas pratique et pas optimisé à coder...

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Merci pour la réponse, ça fonctionne très bien.

    En fait le but du programme est de généré une image (ma matrice B), et l'utilisateur doit avoir la possibilité de sauvegarder l'image en format jpg et également la matrice dans l'idée de pouvoir la recharger par la suite pour une utilisation future avec un autre programme. Alors peut être qu'il existe une meilleure solution? Je n'ai eu que ça comme idée et je pense que c'est mieux qu'il puisse choisir le nom de sauvegarde.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Une autre question, la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assignin('base', [var{1}], B);
    enregistre dans var{1} seulement à la fin de l'exécution de la fonction et non au moment où Matlab parcourt cette ligne? Ça serait tordu mais quand je lui demande juste après :

    Et il me dit qu'il n'y a pas de variable qui porte le nom de var{1}, en effet, en mode debug, la variable n'a pas été enregistrée après le assignin mais a la fin de l'exécution, elle est présente dans le workspace.

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Citation Envoyé par Nyquist Voir le message
    je pense que c'est mieux qu'il puisse choisir le nom de sauvegarde.
    Le nom des fichiers ok, mais pourquoi le nom des variables? l'utilisateur va faire de la programmation avec ces variables?

    Citation Envoyé par Nyquist Voir le message
    Une autre question, la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assignin('base', [var{1}], B);
    enregistre dans var{1} seulement à la fin de l'exécution de la fonction et non au moment où Matlab parcourt cette ligne? Ça serait tordu mais quand je lui demande juste après :

    Et il me dit qu'il n'y a pas de variable qui porte le nom de var{1}, en effet, en mode debug, la variable n'a pas été enregistrée après le assignin mais a la fin de l'exécution, elle est présente dans le workspace.
    Peux-tu nous montrer le code qui permet de reproduire cette erreur ainsi que le message d'erreur complet?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une autre solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var = inputdlg('Enter variable name','Predicted label',1,{''}); 
    S.(var{1}) = B;
    save FMB -struct S

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Voici le message d'erreur obtenu :

    ??? Error using ==> save
    Variable 'image' not found.

    Error in ==> Stein2D at 100
    save ('FBM', var{1})
    'image' c'est le contenu de var{1}

    et le code que j'ai utilisé (se trouvant dans une fonction) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    options.Resize='on';
             var = inputdlg('Entrez un nom pour la sauvegarde','Sauvegarde de l''image.',1,{''},options); 
             assignin('base', [var{1}], B);
             save ('FBM', var{1})
    Au final, j'ai réussi à faire se que je voulais, sans passer par assignin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    options.Resize='on';
             var = inputdlg('Entrez un nom pour la sauvegarde','Sauvegarde de l''image.',1,{''},options); 
             eval([var{1} ' = B;']);
             save ('FBM', var{1})

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    L'erreur est tout à fait logique : dès que MATLAB rentre dans une fonction, MATLAB crée un espace de travail indépendant, or lorsque tu utilises assignin tu lui dit de créer la variable image dans l'espace de travail 'base', qui n'est pas l'espace de travail courant. Pour corriger cela il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assignin('caller', var{1}, B);
    (rq : les crochets sont inutiles autour de var{1})

    Sinon il est souvent recommandé de ne pas utiliser eval, c'est plus source de problème qu'autre chose...

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Oui j'avais déjà essayé avec l'espace de travail du script appelant la fonction, mais ça ne marchait pas également.

    Quelles sont les sources de problèmes fréquentes de eval?

    Et sinon, comment pourrait-on procéder pour faire l'opération inverse?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assignin('base', 'B', var{1});
    En faisant ça, il copie dans B le contenu de var{1}, se qui est au passage tout à fait normal, mais c'est ennuyant, car le contenu de var{1} c'est un nom de variable (donc du texte) donc il copie le nom de la variable dans B, alors que j'aurais aimé qu'il copie le contenu de la variable dont le nom est dans var{1}, est ce possible?
    Désolé pour ces questions, mais à force de chercher à droite à gauche des informations, je m'y perd et je m'enfonce dans mes pensées alors que peut être qu'il existe un moyen plus efficace.

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    eval is evil


    C'est exactement la même erreur lorsque tu utilises 'caller'?

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Oui c'est exactement la même erreur.

    Par contre j'ai édité mon dernier message pendant que tu me répondais donc je te copie/colle mon rajout.

    Et sinon, comment pourrait-on procéder pour faire l'opération inverse?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assignin('base', 'B', var{1});
    En faisant ça, il copie dans B le contenu de var{1}, se qui est au passage tout à fait normal, mais c'est ennuyant, car le contenu de var{1} c'est un nom de variable (donc du texte) donc il copie le nom de la variable dans B, alors que j'aurais aimé qu'il copie le contenu de la variable dont le nom est dans var{1}, est ce possible?
    Désolé pour ces questions, mais à force de chercher à droite à gauche des informations, je m'y perd et je m'enfonce dans mes pensées alors que peut être qu'il existe un moyen plus efficace.

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Citation Envoyé par Nyquist Voir le message
    Désolé pour ces questions, mais à force de chercher à droite à gauche des informations, je m'y perd et je m'enfonce dans mes pensées alors que peut être qu'il existe un moyen plus efficace.
    C'est justement pour éviter ce genre de gymnastique que je te conseillais de ne pas faire nommer les noms de variables par l'utilisateur... d'ailleurs je n'ai toujours pas compris pourquoi tu étais obligé de faire ainsi, peut-être que si tu nous expliques clairement ce que tu cherches à faire et pourquoi tu as fait le choix d'assignin, on pourras alors te proposer une autre solution un peu moins contraignante...

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Ha ben désolé de la question, j'ai trouvé comment faire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        options.Resize='on';
        var = inputdlg('Entrez le nom de l''image.','Chargement de l''image.',1,{''},options);
        S=load (var{1});
        B=S.(var{1});
    Par contre, pour la question originale, j'utilise toujours le eval et d'après tes conseils et le liens que tu as mis, il serait interessant d'utiliser autre chose que le eval et que le assignin (puisque quelque soit le workspace utilisé 'base' ou 'caller') j'ai la même erreur et il me l'assigne seulement à la fin de la fonction.

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Autre solution à ma seconde question, qui permet de charger un fichier .mat (format utiliser avec le save) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        [filename, pathname]=uigetfile('.mat','Selectionnez la matrice');
        B=load(strcat(pathname,filename));
        B=B.(filename(1:end-4));
    L'avantage de ce code par rapport au précédent, c'est qu'il permet d'aller chercher une sauvegarde n'importe où sur le disque.

  15. #15
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Pour charger ta matrice, utilise directement load sans mettre d'argument en entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [filename, pathname]=uigetfile('.mat','Selectionnez la matrice');
    load(fullfile(pathname,filename));
    Il vaut mieux utiliser fullfile aussi pour cancaténer le nom du fichier.

    Sinon pour l'enregistrement, pourquoi ne pas utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [FileName,PathName] = uiputfile;
    save(fullfile(PathName,FileName),'B')
    ?

  16. #16
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Voila, j'ai terminé se que j'avais à faire et je voulais te remercier pour ton aide précieuse, tes conseils et le temps passé pour répondre à mes questions. C'est toujours utile d'avoir un regard extérieur. Grâce à toi j'ai acquis de nouvelles connaissances dont "Eval is evil"

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

Discussions similaires

  1. [SQL2k5][SSIS] Quotes générées dans mes variables dynamiques
    Par Ivynox dans le forum Développement
    Réponses: 0
    Dernier message: 09/08/2010, 10h45
  2. Réponses: 2
    Dernier message: 10/12/2006, 09h57
  3. Problème avec variable dynamique
    Par moyjunior dans le forum Linux
    Réponses: 2
    Dernier message: 22/11/2006, 11h46

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