2012-06-26 13 views
6

Como experimento (y porque yo estoy generando funciones anónimas fuera de los datos del usuario) que corrían el siguiente código de MATLAB:funciones anónimas que se hacen llamar en MATLAB

h = @(x) x * x 
    h = @(x) x * x 
h(3) 
    ans = 9 
h = @(x) h(x) + 1 
    h = @(x)h(x)+1 
h(3) 
    ans = 10 

Básicamente, hice una función anónima llama a sí mismo. En lugar de actuar recursivamente, MATLAB recordó la antigua definición de función. Sin embargo, el espacio de trabajo no lo muestra como una de las variables, y el manejador tampoco parece saberlo.

¿La función anterior se almacenará entre bastidores siempre que conserve la nueva? ¿Hay algún "truco" con este tipo de construcción?

+0

Yo diría que el diseño por sí solo es un "gotcha" y una mala idea, ya que es muy poco intuitivo y se esconde tanto de cualquier persona que mira el código. – tmpearce

Respuesta

8

Una función anónima recuerda la parte relevante del área de trabajo en el momento de la definición, y hace una copia de la misma. Por lo tanto, si incluye una variable en la definición de la función anónima y luego la modifica, conservará el valor anterior dentro de la función anónima.

>> a=1; 
>> [email protected](x)x+a %# define an anonymous function 
h = 
    @(x)x+a 
>> h(1) 
ans = 
    2 
>> a=2 %# change the variable 
a = 
    2 
>> h(1) 
ans = 
    2 %# the anonymous function does not change 
>> g = @()length(whos) 
g = 
    @()length(whos) 
>> g() 
ans = 
    0 %# the workspace copy of the anonymous function is empty 
>> g = @()length(whos)+a 
g = 
    @()length(whos)+a 
>> g() 
ans = 
    3 %# now, there is something in the workspace (a is 2) 
>> g = @()length(whos)+a*0 
g = 
    @()length(whos)+a*0 
>> g() 
ans = 
    1 %# matlab doesn't care whether it is necessary to remember the variable 
>> 
+0

¿Significa esto que no quiero usar funciones anónimas con matrices grandes, especialmente si la memoria es una preocupación? ¿Las funciones anónimas con constantes funcionan como funciones con argumentos, donde solo hacen una copia cuando las cosas cambian? –

+2

@AndrewPiliser: supongo que el copy-on-write también se aplica a las funciones anónimas, es decir, siempre que no cambie el valor de 'a', estará bien. ** editar **: acaba de probarlo. Sí, es copy-on-write. – Jonas

+1

+1 Para su información, creo que las funciones anónimas capturan una copia no solo de la "parte relevante" del espacio de trabajo, sino de todo el espacio de trabajo a partir del momento en que se crea el manejador. Al menos en versiones anteriores de Matlab. (La existencia de 'eval 'significa que Matlab no necesariamente puede saber en tiempo de análisis lo que es relevante). Las funciones anidadas funcionan de esta manera con las variables en vivo que cierran. Puede usar 'info = functions (h)' en su manejador de función para ver lo que capturó, o examinarlo en el depurador. –

Cuestiones relacionadas