6
votes

Comment envelopper une fonction déjà existante avec une nouvelle fonction du même nom

est-il possible de créer une enveloppe autour d'une fonction qui a exactement le même nom que la fonction d'origine?

Cela serait très utile dans les circonstances où l'utilisateur souhaite effectuer des vérifications supplémentaires sur les variables d'entrée avant de passer à la fonction intégrée Comment interrompre le matlab IDE quand il est suspendu à l'affichage d'une très grande matrice?


1 commentaires

Je suis d'accord sur la réponse que vous avez postée sur l'autre question (

3 Réponses :


3
votes

Oui c'est possible mais cela nécessite un peu de piratage. Il exige que vous copiez des poignées de fonction.

à l'aide de l'exemple fourni dans la question que je montrerai comment envelopper la fonction openvar code> dans une fonction définie par l'utilisateur qui vérifie la taille de la variable d'entrée et Permet ensuite à l'utilisateur d'annuler toute opération ouverte pour les variables trop grandes. p>

En outre, cela devrait fonctionner lorsque l'utilisateur double-clique sur une variable dans le volet d'espace de travail de l'IDE MATLAB. P>

Nous devons faire trois choses. P>

  1. Obtenez une poignée à l'original openvar code> fonction li>
  2. Définissez la fonction wrapper qui appelle openvar code> li>
  3. rediriger l'original openvar code> Nom sur notre nouvelle fonction. LI> ol>

    exemple de fonction p> xxx pré>

    une fois que cette fonction est définie, vous devez simplement exécuter un script P>

    • efface toutes les variables nommées openvar code> li>
    • Exécutez le script openvarwrapper code> pour configurer la connexion li>
    • Pointez l'original openvar code> à openvarwrapper code> li> ul>

      exemple script: p> xxx pré>

      Enfin, lorsque vous souhaitez tout nettoyer, vous pouvez simplement appeler: P>

      clear openvar;
      



11
votes

En fait, sinon la réponse de Slayton, vous n'avez pas besoin d'utiliser openvar code>. Si vous définissez une fonction avec le même nom que la fonction MATLAB, il sera ombragé cette fonction (c'est-à-dire appelée à la place).

Pour éviter de faire appel à votre propre fonction de manière récursive, vous pouvez appeler la fonction d'origine de l'enveloppe à l'aide de intégré code>. P>

E.g. p> xxx pré>

exemple simple, nommé rand.m code> et dans le chemin MATLAB: p>

function out = main(varargin)
disp('Test wrapping rand... calling rand now...');
out = builtin('rand', varargin{:});


3 commentaires

Mais il y a tellement de fonctions qui ne sont pas «intégrées» et je veux tous les envelopper!


@Guntherstruyf: Pourquoi voudriez-vous tous les envelopper ... en particulier les non-bâtiments ??


Au travail, nos installations MATLAB sont en lecture seule, alors modifier les fichiers eux-mêmes n'est pas possible. Et il n'est pas pratique d'utiliser toujours myFunInstead de plaisir. surtout quand il s'agit d'améliorer le comportement par défaut. Application du monde réel: Daniel Kessler's Problème



1
votes

Je préfère l'approche de Jmetz en utilisant intégré () quand il peut être appliqué, car il est propre et au point. Malheureusement, de nombreuses fonctions ne sont pas trouvées par intégré () .

J'ai trouvé que je pouvais envelopper une fonction à l'aide d'une combinaison du qui -tall et < Code> CD Commandes. Je soupçonne que cette approche peut être adaptée à une grande variété d'applications.

dans mon exemple d'exemple, je voulais (temporairement) envelopper la fonction Interp1 pour que je puisse vérifier pour vérifier Valeurs de sortie nan. (La fonction INTERP1 sera par défaut, renvoyer une NAN dans certaines conditions, telles que si un point de requête est plus grand que le plus grand point d'échantillon.) Voici ce que j'ai proposé: < pré> xxx

Voir aussi: Comment utiliser Matlab Toolbox Fonction qui a le même nom d'une fonction définie par l'utilisateur


0 commentaires