2012-02-06 12 views
16

¿Existe una forma idiomática de vincular variables en una función MATLAB? Parece que sería bastante común crear una función, enlazar algunos argumentos y luego pasar la nueva función a un optimizador de algún tipo (en mi caso, un solucionador de Newton). No parece que las reglas de alcance variable permitan una solución con funciones anidadas o en línea. ¿Debería simplemente crear una clase? No parece que MATLAB tenga objetos de función de primera clase, ¿es correcto? Mi búsqueda de kung-fu se está quedando corto. ¡Gracias!Evaluación de función parcial en MATLAB

Como ejemplo, supongamos que quiero encontrar las raíces de f (c, x) = x^3 + cx^2 + 2x + 3 para varios valores del parámetro c. Tengo un solucionador de métodos de Newton que toma una función de una variable, no dos. Así que recorro varios valores de c, luego paso la función enlazada al solucionador.

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

Podría dar un ejemplo de lo que estás hablando? ¿Qué es más allá de 'f = @ (x, y) (x + y)'? –

+1

¿Te refieres a una función que devuelve una función? p.ej. 'g = @ (base, x) (@ (x) mod (x, base)); f = g (3); 'y ahora' f (x) 'es simplemente' mod (x, 3) '? –

Respuesta

19

Puede hacerlo de esta manera:

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 clave está en la primera línea: se trata de una función que devuelve una función.

es decir, TI vuelve@(x)(x^3+c*x^2+2*x+3), con el valor de c vinculados en.

+0

¿Cuál es el nombre de este uso del @ -operator en MATLAB (con fines de búsqueda)? – dls

+1

Una función definida con '@ (args) (return val)' se llama función * anonymous *, y 'f' (y' g') también se denominan "manejadores de función". Ver [aquí] (http://www.mathworks.com.au/help/techdoc/matlab_prog/f4-70115.html). –

+2

Impresionante, acabo de verificar esto en Octave. El segundo argumento para f resulta ser un valor ficticio, entonces. –

0

Estoy bastante seguro de que una función anidada se puede utilizar con fminsearch. No sé específicamente sobre el método de Newton, pero creo que no hay problema.

+0

A diferencia de las funciones en línea (que parecen bastante inútiles dada la existencia de funciones anidadas y anónimas), las funciones anidadas funcionarían como cualquier variable en el bloque de código de anidamiento dentro del alcance. El único inconveniente es que tienes que darle explícitamente un nombre a estas variables para acceder a ellas. Esto está bien si va a usarlos para otra cosa, pero parece redundante si va a definirlo e inicializarlo si solo se va a hacer referencia a él dentro de la función anidada. – dls

Cuestiones relacionadas