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 :

assignin + fonction


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 28
    Points : 11
    Points
    11
    Par défaut assignin + fonction
    Bonjour,

    D'après ce que j'ai pu lire sur le net, ce que je voudrai faire semblerait impossible, mais je me permets de poster le soucis pour bien comprendre pourquoi.

    Comment faire pour assigner une valeur à un nom de variable dans une fonction?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function []=abc()
    assign('my_var',3)
    Voila ce que j'aimerai faire, seulement la fonction "assign" n'existe pas
    Pourtant avec eval, il existe "eval" et "evalin", alors pourquoi un "assignin" mais pas de "assign"?

    Autrement dans assignin, on peut mettre 'base' ou 'caller' comme workspace, mais dans les 2 cas la variable créée n'est pas définie dans ma fonction!

    Et maintenant un exemple complet de ce que je cherche à faire:

    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
    % initialisation
     
    i=1;
    y.nom{i}='seconde'; y.valeur(i)=30; y.actif(i)=1; i=i+1;
    y.nom{i}='minute'; y.valeur(i)=15; y.actif(i)=0; i=i+1;
    y.nom{i}='heure'; y.valeur(i)=4; y.actif(i)=1;
     
    j=1;
    for i=1:size(y.valeur,2)
        if y.actif(i)==1
            x(j)=y.valeur(i);
            j=j+1;
        end
    end
     
    % La variable x sera ammenée à varier avec un algorithme d'optimisation
     
    temps=test(x,y);
    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
    function [temps]=test(x,y)
     
    j=1;
    for i=1:size(y.valeur,2)
        if y.actif(i)==1
    %         assignin('caller',y.nom{i},x(j))
            eval([y.nom{i} '=' num2str(x(j),10) ';'])
            j=j+1;
        else
    %         assignin('caller',y.nom{i},y.valeur(i))
            eval([y.nom{i} '=' num2str(y.valeur(i),5) ';'])
        end
    end
     
    temps=seconde+minute*60+heure*3600;
    La solution "eval" c'est ce que j'ai trouvé pour le moment, seulement ça prend trop de temps, d'autant plus que je dois mettre beaucoup de chiffres à num2str pour que l'algo d'optim ne soit pas perdu quand il fait de toutes petites modifs
    Si quelqu'un a une idée complètement différente pour effectuer la même chose, je suis preneur

    Merci!

  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,

    je n'ai pas compris l'intérêt d'utiliser eval ou assignin ici...

    Pourquoi ne pas faire simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function [temps]=test(x,y)
     
    j=1;
    for i=1:size(y.valeur,2)
        if y.actif(i)==1
            y.nom{i} = x(j);
            j=j+1;
        else
            y.nom{i} = y.valeur(i);
        end
    end
     
    temps=seconde+minute*60+heure*3600;
    ?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    et bien je veux arriver à
    minute = 15

    alors qu'avec
    y.nom{2} = x(2)

    j'arrive à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >> y.nom{2}=x(2)
     
    y = 
     
           nom: {'seconde'  [4]  'heure'}
        valeur: [30 15 4]
         actif: [1 0 1]
    sachant le nom de variable "minute" était stocké dans y.nom{2}, il a été écrasé par la valeur 15 avec cette commande

    dans cet exemple avec seulement 3 variables, je pourrai les redéfinir dans la fonction:
    seconde = x(1)
    minute = x(2)
    heure = x(3)

    mais j'ai en réalité beaucoup de variables que je souhaiterai définir une seule fois dans l'initialisation

  4. #4
    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
    Ok, j'avais lu un peu vite.

    Quel est l'intérêt dans ton cas de nommer explicitement la variable en utilisant 'seconde'?

    Si tu n'as pas le choix (mais cela me surprendrait), je ne vois pas d'autre solution que d'utiliser eval.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    L’intérêt est d'avoir des calculs avec ces noms de variables comme
    temps = seconde + ...

    sans avoir à écrire
    temps = z(1) + ...
    avec z(1)=x(1) ou y.valeur(1)

    ça permet donc de rendre le code lisible, de pouvoir ranger les variables dans y dans n'importe quel ordre, de sorte que quand je veux ajouter ou supprimer des variables, c'est très simple

    Pourquoi ne peut-on pas faire assignin dans une fonction!?

  6. #6
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 881
    Points : 3 429
    Points
    3 429
    Par défaut
    on peut faire des assignin dans une fonction
    après la syntaxe est plutôt assignin(workspace,variable,valeur), l’intérêt d'assignin est d'assigner une variable dans un autre workspace (souvent 'base' pour le workspace principal)
    ça a donc tout son sens dans une fonction qui a par définition son propre workspace temporaire

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    oui ok

    maintenant si, dans une fonction, j'ai
    a='nom_var'
    b=3
    et que je veux
    nom_var=3

    pourquoi je ne pourrai pas le faire avec un assignin?

  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
    Citation Envoyé par cailloup Voir le message
    ça permet donc de rendre le code lisible, de pouvoir ranger les variables dans y dans n'importe quel ordre, de sorte que quand je veux ajouter ou supprimer des variables, c'est très simple
    L'exemple que tu donnes montre exactement le contraire : en terme de lisibilité, eval([y.nom{i} '=' num2str(x(j),10) ';']), c'est pas terrible, et pour la simplicité, tu vois bien que tu dois utiliser des chemins détournés pour arriver à une simple opération...

    Sinon, tu peux écrire assign pour affecter ta variable dans la fonction courante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function assign(a,b)
    assignin('caller',a,b)
    Et ta fonction test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function [temps]=test(x,y)
    j=1;
    for i=1:size(y.valeur,2)
        if y.actif(i)==1
            assign(y.nom{i},y.valeur(i));
            j=j+1;
        else
            assign(y.nom{i},y.valeur(i));
        end
    end
     
    temps=seconde+minute*60+heure*3600;
    Mais je ne pense vraiment pas que ce soit une façon très propre de programmer.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Génial!!

    mais c'est fou ça
    j'avais pas compris le fonctionnement de 'caller'

    moi je mettais ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assignin('caller',y.nom{i},x(j))
    dans ma fonction

    mais en fait il fallait que je créé une fonction assign avec assignin('caller',...) dedans

    Résolu du coup j'ai quand meme un peu de mal à saisir pourquoi la fonction "assign" n'est pas incluse dans Matlab, de la même façon qu'il existe "eval" et "evalin" ......... j'ai perdu + d'une journée à comprendre pourquoi mon truc donnait des résultats étranges avec num2str avant de comprendre que c'était parce que je n'avais pas précisé le nombre de chiffres à num2str, pour me rendre compte que finalement le temps de calcul avec cette solution était rédhibitoire, tout ça parce que cette satanée fonction assign n'existe pas lol

    Donc Merci beaucoup!!

    Pour répondre aux remarques:
    La lisibilité des lignes avec eval ou assignin est très mauvaise je suis entièrement d'accord, mais le gain en lisibilité dans la suite de mes calculs est bien plus grand
    J'ai une cinquante de variables appelées dans différentes fonctions par la suite

    temps=fonction1(minute,heure,cafe,table,chaise)
    debout=fonction2(souris,écran,clavier)
    etc etc, j'invente n'importe quoi

    ET, plus important encore, avec ce système je peux ajouter, supprimer, déplacer ma liste de variables sans me soucier de l'ordre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    i=1;
    y.nom{i}='seconde'; y.valeur(i)=30; y.actif(i)=1; i=i+1;
    y.nom{i}='minute'; y.valeur(i)=15; y.actif(i)=0; i=i+1;
    y.nom{i}='nouvelle_variable', y.valeur(i)=0.1; y.actif(i)=0; i=i+1;
    y.nom{i}='heure'; y.valeur(i)=4; y.actif(i)=1;
    Ceci dit il existe probablement un moyen complètement différent de gérer le truc de manière plus propre, mais je n'ai pas trouvé

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. fonctionement de assignin/evalin
    Par Zhitoune dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 27/04/2009, 18h17
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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