Main Content

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 function_handle. Las funciones anónimas pueden aceptar varias entradas y devuelven una salida. Solo pueden contener una instrucción ejecutable.

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(1)
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

An equation for the function g of c which is equal to the integral from 0 to 1 of x squared plus c times x plus 1 times d x.

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:

  1. Escriba el integrando como una función anónima:

    @(x) (x.^2 + c*x + 1)
  2. 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)
  3. 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

Temas relacionados