2011-10-27 9 views
8

Estoy tratando de definir una función anónima que llama a una versión de una función que devuelve múltiples salidas.Funciones de llamada de funciones anónimas con formularios de salida múltiple

Por ejemplo, la función find tiene dos formas posibles de salida:

[row,col] = find(X); 

y

[ind] = find(X); 

decir que me gustaría elegir la primera forma en el interior de una función anónima.

He tratado 1)

get_columns = @(x) x(2); 

y 2)

get_columns = @(x,y) y; 

Pero cuando llame:

get_columns(find(x)) 

La primera versión de get_columns cree que estoy llamando al find como [ind] = find(X) y no como [row,col] = find(X);, mientras que el segundo se queja con "Not enough input arguments".

¿Hay una manera de desencadenar una forma salida específica de una función dentro una función anónima ?

+5

Puede crear una función auxiliar que solicite ambas salidas. Ver también http://stackoverflow.com/questions/3096281/skipping-outputs-with-anonymous-function-in-matlab – Jonas

Respuesta

8

Directamente, no. Desafortunadamente, hay una serie de características que son inaccesibles a través de funciones anónimas, y el acceso a múltiples argumentos de salida es uno de ellos. (El otro que encuentro con frecuencia es que no se puede definir una declaración if dentro de una función anónima. Esto parece ser una limitación de la sintaxis de Matlab más que cualquier otra.

Sin embargo, una función de ayuda bastante sencilla puede hacer esto posible.

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

esta función toma un identificador de función además de una serie de índices de rendimiento, y devuelve los resultados indexados.

Si crea este archivo (esperemos que mejor comentado) y lo puso en su camino, entonces se puede acceder a la segunda salida de la función find como definiendo la siguiente función

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

Y ahora se puede encontrar el encontrar los índices de una matriz, que es igual a 1 como

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

Y ahora usted debe ser capaz de acceder a los argumentos de salida alternativos a voluntad desde dentro de funciones anónimas.

3

Esta función de get_outputs anterior puede ser de gran utilidad para breves funciones anónimas. Muy agradable.

Además, con respecto al comentario de que un "si" no se puede usar en MATLAB, esto solo es parcialmente cierto.El comportamiento idéntico se puede implementar fácilmente de forma anónima. Por ejemplo, aquí hay un anónimo si:

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

Uso:

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

se ejecuta la acción correspondiente a la primera condición verdadera. Por ejemplo, esto imprime 'hola'.

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

De acuerdo, es un poco complicado a primera vista, pero no dejo de algo como esto en mi camino para que pueda utilizar un "si" en una función anónima. Se pueden construir funciones anónimas mucho más complejas de esta manera.

Cuestiones relacionadas