matlab command-line anonymous-function

inline function matlab 2015



¿Cómo ejecutar múltiples instrucciones en una función anónima de MATLAB? (6)

Aquí hay un método que garantizará el orden de ejecución y, (con las modificaciones mencionadas al final) permite pasar diferentes argumentos a diferentes funciones.

call1 = @(a,b) a(); call12 = @(a,b) call1(b,call1(a,b));

La clave es call1 que llama a su primer argumento e ignora su segundo. call12 llama a su primer argumento y luego a su segundo, devolviendo el valor del segundo. Funciona porque una función no se puede evaluar antes de sus argumentos. Para crear tu ejemplo, deberías escribir:

foo = @() call12(functionCall1, functionCall2);

Código de prueba

Aquí está el código de prueba que utilicé:

>> print1=@()fprintf(''1/n''); >> print2=@()fprintf(''2/n''); >> call12(print1,print2) 1 2

Llamando a más funciones

Para llamar a 3 funciones, podrías escribir

call1(print3, call1(print2, call1(print1,print2)));

4 funciones:

call1(print4, call1(print3, call1(print2, call1(print1,print2))));

Para más funciones, continúe con el patrón de anidamiento.

Pasar argumentos

Si necesita pasar argumentos, puede escribir una versión de call1 que tome argumentos y luego realice la modificación obvia de call12 .

call1arg1 = @(a,arg_a,b) a(arg_a); call12arg1 = @(a, arg_a, b, arg_b) call1arg1(b, arg_b, call1arg1(a, arg_a, b))

También puede crear versiones de call1 que toman múltiples argumentos y mezclarlos y combinarlos según corresponda.

Me gustaría hacer algo como esto:

>> foo = @() functionCall1() functionCall2()

Entonces cuando dije:

>> foo()

Ejecutaría functionCall1() y luego ejecutar functionCall2() . (Siento que necesito algo como el operador C )

EDITAR:

functionCall1 y functionCall2 no son necesariamente funciones que devuelven valores.


Es posible, usando la función curly que se usa para crear una lista separada por comas.

curly = @(x, varargin) x{varargin{:}}; f=@(x)curly({exp(x),log(x)}) [a,b]=f(2)


Intentar hacer todo a través de la línea de comandos sin guardar funciones en m-files puede ser una tarea complicada y desordenada, pero esta es una de las maneras en que se me ocurrió ...

Primero, realice sus funciones anónimas y coloque sus handles en una matriz de celdas :

fcn1 = @() ...; fcn2 = @() ...; fcn3 = @() ...; fcnArray = {fcn1 fcn2 fcn3};

... o, si tiene funciones ya definidas (como en m-files), coloque los controladores de función en una matriz de celdas como esta:

fcnArray = {@fcn1 @fcn2 @fcn3};

A continuación, puede crear una nueva función anónima que llame a cada función de la matriz utilizando las funciones cellfun y feval :

foo = @() cellfun(@feval,fcnArray);

Aunque es divertido, funciona.

EDITAR: si las funciones en fcnArray necesitan fcnArray con argumentos de entrada, primero debe asegurarse de que TODAS las funciones de la matriz requieran EL MISMO número de entradas. En ese caso, el siguiente ejemplo muestra cómo llamar a la matriz de funciones con un argumento de entrada cada uno:

foo = @(x) cellfun(@feval,fcnArray,x); inArgs = {1 ''a'' [1 2 3]}; foo(inArgs); %# Passes 1 to fcn1, ''a'' to fcn2, and [1 2 3] to fcn3


WORD OF WARNING: La documentación para cellfun establece que el orden en que se calculan los elementos de salida no está especificado y no se debe confiar en él. Esto significa que no hay garantías de que fcn1 se evalúe antes que fcn2 o fcn3 . Si el orden es importante, la solución anterior no debe usarse.


La sintaxis de la función anónima en Matlab (como algunos otros lenguajes) solo permite una sola expresión. Además, tiene una semántica de enlace variable diferente (las variables que no están en la lista de argumentos tienen sus valores vinculados léxicamente en el momento de creación de la función, en lugar de las referencias que se enlazan). Esta simplicidad permite a Mathworks realizar algunas optimizaciones entre bastidores y evitar muchos problemas de alcance problemático y de duración de objetos al usarlos en scripts.

Si está definiendo esta función anónima dentro de una función (no una secuencia de comandos), puede crear funciones internas con nombre. Las funciones internas tienen un enlace de referencia léxico normal y permiten números arbitrarios de enunciados.

function F = createfcn(a,...) F = @myfunc; function b = myfunc(...) a = a+1; b = a; end end

A veces puedes salirte con trucos como la sugerencia de gnovice.

Tenga cuidado con el uso de eval ... es muy ineficiente (evita el JIT) y el optimizador de Matlab puede confundirse entre las variables y las funciones del ámbito externo que se utilizan dentro de la expresión eval. También es difícil depurar y / o extender el código que usa eval.


Si functionCall1() y functionCall2() devuelven algo y esas cosas se pueden concatenar, entonces puedes hacer esto:

>> foo = @() [functionCall1(), functionCall2()]

o

>> foo = @() [functionCall1(); functionCall2()]

Un efecto secundario de esto es que foo() devolverá la concatenación de cualquier functionCall1() que devuelva CallCall1 functionCall1() y functionCall2() .

No sé si el orden de ejecución de functionCall1() y functionCall2() está garantizado.


Tal vez me estoy perdiendo algo, solo haga una combinación de función llamada que llame a ambas funciones para usted.