6
votes

Comment fonctionnent les fonctions imbriquées dans Matlab?

Alors, je suis Demander un emploi et devez comprendre Les fonctions imbriquées fonctionnent . Pour être plus précis, j'aimerais savoir exactement comment l'exemple suivant posté par gnovice fonctionne.

La question est : P>

Compte tenu de la fonction suivante, quelle sera la sortie lors de la saisie du code ci-dessous dans la fenêtre de commande? p>

function fcnHandle = counter
  value = 0;
  function currentValue = increment
    value = value+1;
    currentValue = value;
  end
  fcnHandle = @increment;
end

f1 = counter();
f2 = counter();
output = [f1() f1() f2() f1() f2()];  %# WHAT IS IT?!


1 commentaires

+1 pour avoir entendu ça dans ta tête! :-)


3 Réponses :


4
votes

Permettez-moi d'essayer ...

Chaque fois que la fonction compteur () son appelé crée une poignée de fonction unique. Cette fonction de fonction est une poignée à une fonction appelée incrément , qui prend sa propre valeur variable et incrémente son par un.

Donc, si appelé deux fois, comme dans le code (F1, F2) chaque fois, chaque fois la même fonction (incrément) mais des poignées différentes. Vous avez la fonction définie deux fois. Et chacun d'eux travaille maintenant de manière indépendante. Comme cette fonction spécifique (incrément) s'appuie dans une valeur interne sauvegardée pour son calcul, vous pouvez observer le mode d'appel comme dans votre échantillon de code, sorties [1 2 1 3 2].

Un bon moyen de saisir Les différences sont mieux consiste à redéfinir la fonction comme suit: xxx

et l'appelant comme: xxx

maintenant, vous verrez que la sortie est [1 2 1001 3 1002]

fait plus de sens maintenant maintenant?

Ce code est créé afin qu'il exploite cet attribut des poignées de fonction ( C'est la même chose, mais sa copie deux fois).


0 commentaires

2
votes

exercice soigné. Je n'ai jamais utilisé les fonctions imbriquées avec des poignées avant, alors voici mon processus de pensée: J'ai trouvé ce paragraphe dans Le manuel très instructif :

Les fonctions imbriquées peuvent utiliser des variables à partir de trois sources: p>

f1 = counter();
f2 = counter();


0 commentaires

5
votes

Cette forte> Utilisation de fonctions imbriquées est pertinente pour la mémoire de mémoisation (pour une lecture supplémentaire voir: Utilisez des fonctions imbriquées pour mémoiser les fonctions coûteuses ), puisqu'elle exploite fonction de fonction paramétrique qui stocke la valeur des paramètres de la création.

Il y a deux choses que vous devez remarquer: p>

  1. compteur () code> retourne une fonction de fonction directement à la fonction imbriquée p>

    s.workspace{1}
    ans = 
        fcnHandle: @counter/increment
            value: 0
    
  2. La fonction imbriquée "enregistrera" les variables scopées. Se référer à Fonctions () Code> pour Détails. P>

    s = functions(f1)
    s = 
         function: 'counter/increment'
             type: 'nested'
             file: '\\ic.ac.uk\homes\ok1011\MATLAB\counter.m'
        workspace: {[1x1 struct]}
    


1 commentaires

J'aime mieux cette explication. Il montre les internes de ce qui se passe réellement. +1.