Funciones anónimas
¿Qué son las funciones anónimas?
Una función anónima es una función que no se almacena en un archivo de programa, pero se asocia con una variable cuyo tipo de datos es
. Las funciones anónimas pueden aceptar varias entradas y devuelven una salida. Solo pueden contener una instrucción ejecutable.function_handle
Nota
Puede crear una función anónima que devuelva varias salidas usando la función deal
. Para ver un ejemplo, consulte Return Multiple Outputs from Anonymous Function.
Por ejemplo, cree un identificador para una función anónima que busque el cuadrado de un número:
sqr = @(x) x.^2;
La variable sqr
es un identificador de función. El operador @
crea el identificador y los paréntesis ()
inmediatamente después del operador @
incluyen los argumentos de entrada de la función. Esta función anónima acepta una sola entrada x
y devuelve implícitamente una sola salida, un arreglo del mismo tamaño que x
que contiene los valores cuadrados.
Busque el cuadrado de un valor particular (5
) pasando el valor al identificador de la función, tal y como pasaría un argumento de entrada a una función estándar.
a = sqr(5)
a = 25
Muchas funciones de MATLAB® aceptan identificadores de funciones como entradas para que pueda evaluar funciones en un rango de valores. Puede crear identificadores para funciones anónimas o para funciones en archivos de programa. La ventaja de utilizar funciones anónimas es que no tiene que editar y mantener un archivo para una función que requiere solo una breve definición.
Por ejemplo, busque la integral de la función sqr
de 0
a 1
pasando el identificador de función a la función integral
:
q = integral(sqr,0,1);
No es necesario crear una variable en el espacio de trabajo para almacenar una función anónima. En su lugar, puede crear un identificador de función temporal dentro de una expresión, como esta llamada a la función integral
:
q = integral(@(x) x.^2,0,1);
Variables en la expresión
Los identificadores de función pueden almacenar no solo una expresión, sino también variables que la expresión requiere para la evaluación.
Por ejemplo, cree un identificador para una función anónima que requiera coeficientes a
, b
y c
.
a = 1.3; b = .2; c = 30; parabola = @(x) a*x.^2 + b*x + c;
Puesto que a
, b
y c
están disponibles en el momento en que crea parabola
, el identificador de función incluye esos valores. Los valores se mantienen dentro del identificador de función aunque borre las variables:
clear a b c x = 1; y = parabola(x)
y = 31.5000
Para proporcionar distintos valores para los coeficientes, debe crear un nuevo identificador de función:
a = -3.9; b = 52; c = 0; parabola = @(x) a*x.^2 + b*x + c; x = 1; y = parabola(x)
y = 48.1000
Puede guardar identificadores de funciones y sus valores asociados en un archivo MAT y cargarlos en una sesión de MATLAB posterior utilizando las funciones save
y load
, como
save myfile.mat parabola
Utilice solo variables explícitas cuando construya funciones anónimas. Si la función anónima accede a alguna variable o función anidada a las que no se haga referencia explícitamente en la lista de argumentos o el cuerpo, MATLAB genera un error cuando se invoca la función. Las llamadas a variables implícitas y funciones suelen encontrarse en las funciones, como eval
, evalin
, assignin
y load
. Evite utilizar estas funciones en el cuerpo de las funciones anónimas.
Funciones anónimas múltiples
La expresión en una función anónima puede incluir otra función anónima. Esto resulta útil para pasar distintos parámetros a una función que está evaluando en un rango de valores. Por ejemplo, puede resolver la ecuación
para diversos valores de c
combinando dos funciones anónimas:
g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));
A continuación se explica cómo derivar esta instrucción:
Escriba el integrando como una función anónima:
@(x) (x.^2 + c*x + 1)
Evalúe la función de cero a uno pasando el identificador de función a
integral
:integral(@(x) (x.^2 + c*x + 1),0,1)
Proporcione el valor para
c
construyendo una función anónima para toda la ecuación:g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));
La función final le permite resolver la ecuación para cualquier valor de c
. Por ejemplo:
g(2)
ans = 2.3333
Funciones sin entradas
Si su función no requiere ninguna entrada, utilice paréntesis vacíos cuando defina la función anónima y la llame. Por ejemplo:
t = @() datestr(now); d = t()
d = 26-Jan-2012 15:11:47
Omitir los paréntesis en la instrucción de asignación crea otro identificador de función y no ejecuta la función:
d = t
d = @() datestr(now)
Función con varias entradas o salidas
Las funciones anónimas requieren que especifique explícitamente los argumentos de entrada como lo haría para una función estándar, separando varias entradas con comas. Por ejemplo, esta función acepta dos entradas, x
e y
:
myfunction = @(x,y) (x^2 + y^2 + x*y); x = 1; y = 10; z = myfunction(x,y)
z = 111
Sin embargo, una función anónima devuelve solo una salida. Si la expresión en la función devuelve varias salidas, entonces puede solicitarlas cuando invoca el identificador de función.
Por ejemplo, la función ndgrid
puede devolver tantas salidas como número de vectores de entrada. Esta función anónima que llama a ndgrid
devuelve solo una salida (mygrid
). Invoque mygrid
para acceder a las salidas que ha devuelto la función ndgrid
.
c = 10; mygrid = @(x,y) ndgrid((-x:x/c:x),(-y:y/c:y)); [x,y] = mygrid(pi,2*pi);
Puede utilizar la salida de mygrid
para crear una gráfica de malla o de superficie:
z = sin(x) + cos(y); mesh(x,y,z)
Arreglos de funciones anónimas
Aunque la mayoría de tipos de datos fundamentales de MATLAB admiten arreglos multidimensionales, los identificadores de funciones deben ser escalares (elementos únicos). Sin embargo, puede almacenar varios identificadores de funciones utilizando un arreglo de celdas o un arreglo de estructuras. El método más común es utilizar un arreglo de celdas, como
f = {@(x)x.^2; @(y)y+10; @(x,y)x.^2+y+10};
Cuando cree el arreglo de celdas, tenga en cuenta que MATLAB interpreta los espacios como separadores de columnas. Omita espacios de expresiones, tal y como se muestra en el código anterior, o ponga las expresiones entre paréntesis, como
f = {@(x) (x.^2); @(y) (y + 10); @(x,y) (x.^2 + y + 10)};
Acceda al contenido de una celda utilizando llaves. Por ejemplo, f{1}
devuelve el primer identificador de función. Para ejecutar la función, pase valores de entrada entre paréntesis después de las llaves:
x = 1; y = 10; f{1}(x) f{2}(y) f{3}(x,y)
ans = 1 ans = 20 ans = 21