7 votes

En utilisant des boucles for/while dans des fonctions anonymes en Matlab

J'ai trouvé la fonction anonyme assez utile, mais beaucoup de fois j'aurai besoin d'utiliser une boucle pour faire fonctionner la fonction. Par exemple:

while val

`

Je suis conscient que je peux enregistrer la fonction dans un fichier séparé, et que parfois je peux vectoriser le code et ensuite la fonction anonyme peut fonctionner, mais dans certains cas il est très difficile de trouver une alternative à une boucle for.

La documentation de Matlab n'en parle pas ou ne dit pas que c'est impossible. Des idées?

`

7voto

MattLab Points 305

Les structures de programmation fonctionnelle sur l'échange de fichiers de Mathworks sont précisément ce dont vous avez besoin. Chacune de ces fonctions est conçue pour être utilisée dans des fonctions anonymes. Elles sont discutées en détail dans une série en 3 parties sur le blog Loren on the Art of MATLAB : Partie 1, Partie 2 et Partie 3.

En particulier, la Partie 3 aborde la mise en œuvre de boucles en tant que fonction. Pour compléter, je vais emprunter une partie du code de Functional Programming FEX submission pour démontrer comment en m-code nous pouvons utiliser une boucle while dans une fonction anonyme. Tout d'abord, définissons une fonction loop:

   function x = loop(x, continueFcn, f)
   % Inputs:
   % x           - État initial (peut être un tableau de cellules d'arguments pour f)
   % continueFcn - Fonction de continuation, renvoie vrai si la boucle doit continuer
   % f           - Fonction de l'état (x) à exécuter à chaque itération
       while ~continueFcn(x{:})
           x = f(x{:});
       end
   end

Pour l'exemple fourni, val aura une valeur initiale, disons val0. De plus, supposons que StuffDoneEachWhileLoop soit une fonction qui définit comment la variable val doit être mise à jour à chaque boucle while. Alors :

myFunc = @(n) loop(val0, ...                    % Initialiser l'état
                  @(val) val < tolérance, ...   % Condition OP
                  @(val) StuffDoneEachWhileLoop(val));    %  

Diverses extensions de l'idée ci-dessus sont possibles. Consultez la soumission de Functional Programming FEX de Tucker McClure pour plus de détails.

1voto

Dennis Jaheruddin Points 10154

Si votre principal problème est de devoir créer un nouveau fichier m à chaque fois que vous souhaitez utiliser une fonction simple, ceci pourrait être une solution simple pour vous.

Si vous écrivez une fonction et que vous souhaitez utiliser une autre fonction uniquement dans ce contexte, vous n'avez pas besoin de créer un nouveau fichier m. Au lieu de cela, vous pouvez simplement définir une deuxième fonction qui est disponible localement.

Vérifiez cet exemple :

function [m,s] = stat2(x)
n = length(x);
m = avg(x,n);
s = sqrt(sum((x-m).^2/n));
end

function m = avg(x,n)
m = sum(x)/n;
end

http://www.mathworks.nl/help/matlab/ref/function.html;jsessionid=903a612c197e288e7cf631d7a434

0voto

3lectrologos Points 4673

La documentation de Matlab en parle en réalité, cependant l'explication peut être considérée comme quelque peu vague. De la documentation sur les fonctions anonymes :

Les fonctions anonymes peuvent accepter des entrées et renvoyer des sorties, tout comme le font les fonctions standard. Cependant, elles ne peuvent contenir qu'une seule instruction exécutable.

Ce que je comprends par "instruction exécutable" est en fait une expression qui obtient une valeur quelconque.

D'après ce que je sais, les boucles en Matlab n'ont pas de valeur et ne peuvent donc pas être utilisées comme seule instruction exécutable à l'intérieur d'une fonction anonyme. De plus, la contrainte d'une seule instruction signifie que vous ne pouvez pas utiliser la boucle pour effectuer un calcul puis renvoyer une valeur avec une seconde instruction à l'intérieur de la fonction anonyme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X