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 :

[isequal] comparer deux function_handle retourne toujours 'false'


Sujet :

MATLAB

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 94
    Points : 85
    Points
    85
    Par défaut [isequal] comparer deux function_handle retourne toujours 'false'
    Bonjour,

    Mon problème est: comment comparer deux function_handles.
    L'un est enregistré dans ue variable et l'autre est livré tel quel
    à la fonction de comparaison (isequal par exemple)

    Voilà le code que j'ai inscrit dans une fonction.

    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
     
    %Pointer1 est un pointeur de fonction, qui a été initialisé par une fonction 
    %externe: getValue. 
    %Ce pointeur doit s'appeler normalement
    % très précisemment:
    %@functionOfPOinter1
     
    if (isequal(Pointer1,@functionOfPointer1))
    <div style="margin-left:40px">%... texte</div>else
     
    %si l'égalité n'est pas vérifiée, afficher les valeurs mises en jeu
    <div style="margin-left:40px">disp(' the pointer1 is equal to');
    %la valeur telle qu'elle a du être initialisée(on sait jamais,
    % la fonction peut être mal ficelée
    getValue('pointer1')
    %encore, je vérifie que j'ai bien attribué un function_handle
    disp(' the pointer1 is a function handle, yes or no:');
    isa(pointer1,'function_handle')
    %là, encore, vérification
    disp(' @functionOfPointer1 is a function handle, yes or no:');
    isa(@functionOfPointer1,'function_handle')
    %Maintenant, déterminr à nouveau si le deux pointeurs sont égaux
    disp('isequal(pointer1,@functionOfPointer1) is equal to ' );
    isequal(pointer1,@functionOfPointer1)</div>end
    Mon but est de faire marcher le code après la condition "if". tout le code
    dans la boucle "else" devait m'aider à comprendre pourquoi la condition
    du "if"n'est pas vérifiée.

    Voici la réponse de Matlab
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    the pointer1 is equal to
    ans = 
        @functionOfPointer1
     the pointer1 is a function handle, yes or no:
    ans =
         1
     @functionOfPointer1 is a function handle, yes or no:
    ans =
         1
    isequal(pointer1,@functionOfPointer1) is equal to 
    ans =
         0
    Ma question est la suivante:
    comment comparer deux function_handles?? si la fonction isequal ne marche pas,
    je vois pas.
    Par ailleurs, est-ce que ca plante à cause d'une erreur bête que je n'ai pas vue?

    merci d'avance
    adriano

  2. #2
    Expert éminent sénior
    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
    Points : 14 828
    Points
    14 828
    Par défaut
    Il s'agit d'un bug référencé (si tu as accès : ici)

    Pour résumer si tu n'as pas accès à la page :
    This is not a bug, but rather insufficiently documented behavior of isequal on anonoymous function handles. Saving the function handle in effect loses track of the original circumstances under which the function handle was created, and reloading it results in a function handle that compares as being unequal to the original function handle.
    Une possibilité pourrait être de comparer les chaines de caractères obtenues avec FUNC2STR, même si tu pers alors de l'information.

    Sinon si tu affiches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    disp(Pointer1)
    disp(@functionOfPointer1)
    ça donne quoi ?

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 94
    Points : 85
    Points
    85
    Par défaut le problème se transforme
    Merci de me répondre.

    Je savais pas pour le bug référencé.
    J'essaie avec la commande func2str.
    Mais j'ai un second problème: une de mes fonctions
    est une "nested function". Donc func2str(@functionOfPointer1)
    renvoie " NameOFMain/functionOfPointer1 "


    Bon. ben, je continue de chercher.. j'avais vraiment eu l'espoir que je n'aurai pas à manipuler des string et des char, mais quand il faut,il faut :-)

    Encore merci
    adriano

  4. #4
    Expert éminent sénior
    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
    Points : 14 828
    Points
    14 828
    Par défaut
    Donc ce ne sont pas les mêmes fonctions
    Donc ISEQUAL a raison....

    Je ne comprends pas très bien ce que tu veux comparer.
    Si tu veux comparer des handles de fonctions il faut bien qu'ils pointent vers la même fonction...

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 94
    Points : 85
    Points
    85
    Par défaut re re
    Quand j'appelle la fonction "functionOfPointer1" au sein de "main", il n'y a pas de problème.
    Quand matlab convertit mon pointeur @functionofPOinter1 en un string, il ajoute la fonction mère au sein de laquelle cette nested function est crée.

    func2str(@functionOfPointer1) rend: "main/functionOfPOinter1".

    Ce qui est agacant, c'Est que quand je veux exécuter main/functionOfPointer (qui ne prend pas de paramètre d'entrée), ca ne marche pas car Matlab a besoin de "entry1" pour lancer main



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    function main(entry1)
    
    %code pointer1=getValue; if isequal(pointer1,@functionOfPointer1)
    %do this and this
    end %écriture de la nested function function functionOfPointer1 %code code end
    end

  6. #6
    Expert éminent sénior
    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
    Points : 14 828
    Points
    14 828
    Par défaut
    J'ai toujours pas tout compris

    Mais oui une sous-fonction ne peut absolument pas être lancée en dehors de l'environnement de la fonction à laquelle elle appartient.
    C'est pour ça que c'est une sous-fonction...

    Si tu veux pouvoir utiliser cette fonction ailleurs il te faut l'externaliser.

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 94
    Points : 85
    Points
    85
    Par défaut
    Je veux utiliser ma sous-fonction dans la fonction à laquelle la sous-fonction est rattachée. Cette sous-fonction a un nom "functionOfPOinter1". J'appelle, dans ma fonction principale "main" une fonction externe qui me renvoie le nom d'un pointeur "pointer1". tu me suis?
    Si ce pointeur "pointer1" désigne "functionOfPointer1", alor je veux effectuer un certain nombre d'opérations. Mais ce pointeur "pointer1" pourrait désigner d'autres fonctions ou sous-fonctions! C'et pour ca que je compare.
    Malheureusement, isequal ne marche pas et de plus, la fonction func2str rallonge le nom de ma fonction.


    Bon, je vais essayer quand même avec func2str ou trouver une autre solution.


    Merci encore,
    je crois que le problème est résolu (il a changé)

    Bonne soirée

    Adriano

  8. #8
    Expert éminent sénior
    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
    Points : 14 828
    Points
    14 828
    Par défaut
    Mais dans ce cas appelle-là tout simplement, pourquoi as-tu besoin de faire un test de comparaison ?

    Peut-être rajouter un TRY/CATCH au cas où la fonction entrée n'existerait pas.

  9. #9
    Membre averti

    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Points : 352
    Points
    352
    Par défaut
    Citation Envoyé par Caro-Line Voir le message
    Mais oui une sous-fonction ne peut absolument pas être lancée en dehors de l'environnement de la fonction à laquelle elle appartient.
    C'est pour ça que c'est une sous-fonction...
    Incorrect.

    mainfun.m :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function f = mainfun
        f = @subfun;
        str = 'blabla';
     
        function subfun
            disp('sub function');
            disp(str);
        end
     
    end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    >> f = mainfun;
    >> f();
    sub function
    blabla

  10. #10
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 313
    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 313
    Points : 52 905
    Points
    52 905
    Par défaut
    Citation Envoyé par paradize3 Voir le message
    Incorrect.
    Sauf que, pour être précis, dans ton code subfun n'est pas une sous-fonction mais une fonction imbriquée (nested function)

    Le code avec une sous-fonction s'écrit comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function f = mainfun
        f = @subfun;
        str = 'blabla';
     
        function subfun
            disp('sub function');
            disp(str);
    Et malheureusement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >> f = mainfun;
    >> f()
    sub function
    ??? Undefined function or variable 'str'.
     
    Error in ==> mainfun>subfun at 7
            disp(str);
    La différence se fait bien évidemment sur la visibilité des variables à l'intérieur de subfun

  11. #11
    Membre averti

    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Points : 352
    Points
    352
    Par défaut
    Pardon pour l'abus de langage. Dans le code de l'OP il s'agit bien d'une fonction imbriquee.
    Quoi qu'il en soit, je voulais juste souligner le fait que fonction imbriquee ou sous fonction peuvent etre appellees de l'exterieur si on dispose de leur handle.

    Salutations,

    Greg

  12. #12
    Membre averti

    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Points : 352
    Points
    352
    Par défaut
    OP: si ta 'nested' function n'utilise pas le contexte de la fonction parente, tu pourrais la changer en sous function, ca devrait resoudre ton probleme avec isequal.

    Salutations,

    Greg

  13. #13
    Membre régulier
    Inscrit en
    Novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 94
    Points : 85
    Points
    85
    Par défaut explication de pourquoi ca nemarche pas
    Le lien ci dessous peut aider à comprendre pourquoi le code ne marchait pas:

    http://www.mathworks.com/access/help...html#brlptk1-6
    Comparing Handles to Nested Functions
    deux function_handle d'une fonction imbriquée (nested function), enregistrés dans deux variables h1 et h2, ne sont égaux que si ils ont été attribués lors du même appel de la fonction mère (la nesting function).

    J'ai à peu près surmonté le problème en comparant le résultat de func2str(h1) et func2str(h2).

    merci pour l'aide,
    salut
    oodbae

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/02/2016, 23h11
  2. IsAjaxRequest Retourne toujours false
    Par Akawan dans le forum ASP.NET MVC
    Réponses: 2
    Dernier message: 17/09/2010, 16h50
  3. checkdnsrr retourne toujours false
    Par razbitume dans le forum Langage
    Réponses: 6
    Dernier message: 27/07/2009, 21h21
  4. ma nouvelle class retourne toujours false
    Par gtraxx dans le forum jQuery
    Réponses: 2
    Dernier message: 30/12/2008, 08h57
  5. [XSLT]fonction contains retourne toujours false
    Par wildmary dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 01/08/2007, 11h22

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