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 :

Transformer une String en fonction


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7
    Par défaut Transformer une String en fonction
    Bonjour,

    Je souhaite transformer une String du genre 'x+1' en fonction.

    Pour être plus clair, voici le contexte :
    J'ai une interface dans laquelle l'utilisateur saisit une formule ('x+1') que je récupère donc dans une variable formule de type String. Je souhaite ensuite appliquer cette formule à une variable y en fonction de x. J'ai d'abord penser utiliser la fonction eval de Matlab :
    mais étant donné que j'appelle cette fonction dans une boucle et que la formule peut être complexe, le temps de traitement est très long (à cause de eval()).

    Pour résumer différemment, est-il possible de créer une variable f de type function_handle et de valeur @(x)x+1 à partir de la String 'x+1' ?

    En espérant avoir été assez clair, merci pour vos réponses.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Tu peux peut être utiliser INLINE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    str='x+1';
    f=inline(str,'x');

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7
    Par défaut
    Merci je ne connaissais pas,
    mais le temps de traitement est aussi long qu'avec la fonction eval (et beaucoup plus long que lorsque l'on rentre la formule en dur).

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Peut être quelque chose comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    f='x+1';
     
    g=eval(['@(x) ' f]);
     
    for n=1:3
     
       g(n)
     
    end
    (merci Caro pour l'idée)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7
    Par défaut
    Ca fontionne et c'est plus rapide que le inline.
    En revanche ça reste toujours un peu long et dans ce cas je ne comprends pas pourquoi le traitement est plus long que si on rentrait directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    g=@(x) x+1;
     
    for n=1:3
     
       g(n)
     
    end
    puisque des deux manières, on a bien @(x) x+1 dans g.

  6. #6
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Ca dépend à quel niveau tu regardes le temps.
    Petit test tout bête :
    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
    clear all
    g=@(x) x+1;
    tic
    for n=1:30
       g(n);
    end
    toc
     
    clear all
    f='x+1';
    g=eval(['@(x) ' f]);
    tic
    for n=1:30
       g(n);
    end
    toc
    Moi j'obtiens :
    Elapsed time is 0.002189 seconds.
    Elapsed time is 0.002059 seconds.
    (en le faisant plusieurs fois bien sûr)
    Donc à peu près équivalent.

    Tu n'as pas d'autres choses dans ta boucle qui pourraient être optimisées ?

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

Discussions similaires

  1. Transformer une string en int
    Par blueice dans le forum AppleScript
    Réponses: 1
    Dernier message: 28/09/2014, 18h55
  2. Réponses: 3
    Dernier message: 18/02/2013, 05h15
  3. transformer une string en tableau
    Par alexis.gruet dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/04/2007, 23h12
  4. Transformer une String en Unicode
    Par annemarie dans le forum Delphi
    Réponses: 3
    Dernier message: 28/02/2007, 17h43
  5. Transformer une string en un dictionnaire
    Par nabix dans le forum Général Python
    Réponses: 5
    Dernier message: 24/11/2005, 17h34

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