2011-10-27 3 views
8

J'essaie de définir une fonction anonyme qui appelle une version d'une fonction qui renvoie plusieurs sorties.Fonctions anonymes appelant des fonctions avec plusieurs formulaires de sortie

Par exemple, la fonction find a deux formes de sortie possibles:

[row,col] = find(X); 

et

[ind] = find(X); 

dire que je voudrais choisir la première forme à l'intérieur d'une fonction anonyme.

J'ai essayé 1)

get_columns = @(x) x(2); 

et 2)

get_columns = @(x,y) y; 

Mais quand je l'appelle:

get_columns(find(x)) 

La première version de get_columns pense que j'appelle find comme [ind] = find(X) et non comme [row,col] = find(X);, tandis que le second se plaint de "Not enough input arguments".

est-il un moyen de déclencher une forme de sortie spécifique d'une fonction à l'intérieur une fonction anonyme ?

+5

Vous pouvez créer une fonction d'assistance qui demande les deux sorties. Voir aussi http://stackoverflow.com/questions/3096281/skipping-outputs-with-anonymous-function-in-matlab – Jonas

Répondre

8

Directement, non. Malheureusement, il existe un certain nombre de fonctionnalités qui sont inaccessibles via des fonctions anonymes, et l'accès à plusieurs arguments de sortie en fait partie. (L'autre que je trouve fréquemment est que vous ne pouvez pas définir une instruction if à l'intérieur d'une fonction anonyme.Cela semble être une limitation de la syntaxe Matlab plus que toute autre chose.Cependant, une fonction d'aide assez simple peut rendre cela possible.

function varargout = get_outputs(fn, ixsOutputs) 
output_cell = cell(1,max(ixsOutputs)); 
[output_cell{:}] = (fn()); 
varargout = output_cell(ixsOutputs); 

cette fonction prend une poignée de fonction et d'une gamme d'indices de sortie et renvoie les sorties indexées.

Si vous créez ce fichier (espérons-le mieux commenté) et le mettre sur votre chemin, vous pouvez accéder à la seconde sortie de la fonction find en définissant la fonction suivante

find_2nd = @(x)get_outputs(@()find(x),2) 

Et maintenant, vous pouvez trouver trouver les indices d'un tableau qui égalent 1

>> find_2nd([4 3 2 1]==1) 
ans = 
    4 

Et maintenant, vous devriez être en mesure d'accéder à des arguments de sortie alternatifs à volonté de dans des fonctions anonymes.

3

Cette fonction get_outputs ci-dessus pourrait être très utile pour de brèves fonctions anonymes. Très agréable.

En outre, en ce qui concerne le commentaire qu'un "si" ne peut pas être utilisé dans MATLAB, cela n'est que partiellement vrai.Un comportement identique peut facilement être implémenté de manière anonyme. Par exemple, voici un anonyme si:

anonymous_if = @(varargin) varargin{2*find([varargin{1:2:end}], 1, 'first')}(); 

Utilisation:

out = anonymous_if(condition1, action1, condition2, action2, ...); 

L'action correspondant à la première vraie condition est exécutée. Par exemple, cela affiche 'bonjour'.

anonymous_if(false, @() disp('hi'), ... % if false, print 'hi' 
      true, @() disp('hello')) % else if true, print 'hello' 

Accordée, il est un peu compliqué à première vue, mais je garde quelque chose comme ça sur mon chemin pour que je puisse utiliser un « si » dans une fonction anonyme. Des fonctions anonymes beaucoup plus complexes peuvent être construites de cette manière.

Questions connexes