2012-06-26 11 views
6

Come esperimento (e perché sto generando funzioni anonime fuori dei dati degli utenti) ho eseguito il seguente codice MATLAB:funzioni anonime si chiamano in 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 

Fondamentalmente, ho fatto una funzione anonima chiamata stessa. Invece di agire in modo ricorsivo, MATLAB ha ricordato la vecchia definizione di funzione. Tuttavia, lo spazio di lavoro non lo mostra come una delle variabili e anche l'handle non sembra saperlo.

La vecchia funzione può essere archiviata dietro le quinte finché mantengo quella nuova? Ci sono dei "trucchi" con questo tipo di costruzione?

+0

Direi che il design tutto da solo è un "gotcha" e una cattiva idea, dal momento che è così non intuitivo e si nasconde così tanto da chiunque altro guardando il codice. – tmpearce

risposta

8

Una funzione anonima ricorda la parte pertinente dello spazio di lavoro al momento della definizione e ne fa una copia. Quindi, se si include una variabile nella definizione della funzione anonima e si modifica tale variabile in un secondo momento, si manterrà il vecchio valore all'interno della funzione anonima.

>> 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

Questo significa che non voglio usare funzioni anonime con matrici di grandi dimensioni, specialmente se la memoria è un problema? Le funzioni anonime con costanti funzionano come le funzioni con argomenti, in cui eseguono una copia solo quando le cose vengono modificate? –

+2

@AndrewPiliser: Suppongo che la copia su scrittura si applichi anche alle funzioni anonime, cioè finché non si modifica il valore di 'a', starai bene. ** edit **: l'ho appena testato. Sì, è copy-on-write. – Jonas

+1

+1 FYI, penso che le funzioni anonime catturino una copia non solo della "parte rilevante" dell'area di lavoro, ma dell'intero spazio di lavoro al momento della creazione della maniglia. Almeno nelle precedenti versioni di Matlab. (L'esistenza di "eval" significa che Matlab non può necessariamente sapere in tempo di analisi ciò che è rilevante.) Le funzioni annidate funzionano in questo modo su variabili live che chiudono. Puoi usare 'info = functions (h)' sul tuo handle di funzione per vedere cosa ha catturato, o esaminarlo nel debugger. –

Problemi correlati