2012-02-06 17 views
16

Esiste un modo idiomatico per legare le variabili in una funzione MATLAB? Sembra che sarebbe abbastanza comune creare una funzione, associare alcuni argomenti, quindi passare la nuova funzione a un ottimizzatore di qualche tipo (nel mio caso, un risolutore di Newton). Non sembra che le regole di scope variabile consentano una soluzione con funzioni nidificate o inline. Dovrei semplicemente creare una classe? Non sembra che MATLAB abbia oggetti funzione di prima classe, è corretto? Il mio kung-fu di ricerca sta venendo su corto. Grazie!Valutazione delle funzioni parziali in MATLAB

Come esempio, supponiamo di voler trovare le radici di f (c, x) = x^3 + cx^2 + 2x + 3 per vari valori del parametro c. Ho un metodo risolutore di Newton che prende una funzione di una variabile, non di due. Quindi eseguo il loop su vari valori di c, quindi trasferisco la funzione associata al risolutore.

for c=1:10 
    g=f(c); % somehow bind value of c 
    seed=1.1; % my guess for the root of the equation 
    root=newton(g,seed); % compute the actual root 
end 
+1

Potrebbe fornire un esempio di cosa stai parlando? Cosa c'è oltre 'f = @ (x, y) (x + y)'? –

+1

Intendi una funzione che restituisce una funzione? per esempio. 'g = @ (base, x) (@ (x) mod (x, base)); f = g (3); 'e ora' f (x) 'è solo' mod (x, 3) '? –

risposta

19

È possibile farlo in questo modo:

f = @(c,x)(@(x)(x^3+c*x^2+2*x+3)); 

for c=1:10 
    g=f(c); % g is @(x)(x^3+c*x^2+2*x+3) for that c 
    .... 
end 

La chiave è la prima linea: si tratta di una funzione che restituisce una funzione.

cioè esso rendimenti@(x)(x^3+c*x^2+2*x+3), con il valore di c legati in.

+0

Qual è il nome di questo utilizzo di @ -operator in MATLAB (a scopo di ricerca)? – dls

+1

Una funzione definita con '@ (args) (return val)' è chiamata funzione * anonymous *, e 'f' (e' g') sono anche chiamati "handle di funzione". Vedi [qui] (http://www.mathworks.com.au/help/techdoc/matlab_prog/f4-70115.html). –

+2

Impressionante, l'ho appena verificato in Octave. Il secondo argomento di f risulta essere un valore fittizio, quindi. –

0

Sono abbastanza sicuro che una funzione annidata può essere utilizzata con fminsearch. Non so in modo specifico del metodo Newton, ma la mia ipotesi è che non ci siano problemi.

+0

A differenza delle funzioni inline (che sembrano piuttosto inutili data l'esistenza di funzioni nidificate e anonime), le funzioni annidate funzionerebbero come qualsiasi variabile nel blocco del codice di annidamento è nell'ambito. L'unico lato negativo è che devi assegnare esplicitamente a queste variabili un nome per accedervi. Questo è ok se li userai per qualcos'altro, ma sembra ridondante se lo definirai e inizializzalo se si farà riferimento solo all'interno della funzione annidata. – dls

Problemi correlati