matlab - punto - ¿Qué es una función manejar y cómo es útil?
subplot matlab (3)
¿Alguien puede explicarme el significado del operador @
(control de función) y por qué usarlo?
Descargo de responsabilidad: código no probado ...
El operador de manejo de función le permite crear una referencia a una función y pasarla como cualquier otra variable:
% function to add two numbers
function total = add(first, second)
total = first + second;
end
% this variable now points to the add function
operation = @add;
Una vez que tienes un identificador de función, puedes invocarlo como una función normal:
operation(10, 20); % returns 30
Una cosa buena acerca de los identificadores de funciones es que puedes pasarlos como cualquier otro dato, para que puedas escribir funciones que actúen sobre otras funciones. Esto a menudo le permite separar fácilmente la lógica comercial:
% prints hello
function sayHello
disp(''hello world!'');
end
% does something five times
function doFiveTimes(thingToDo)
for idx = 1 : 5
thingToDo();
end
end
% now I can say hello five times easily:
doFiveTimes(@sayHello);
% if there''s something else I want to do five times, I don''t have to write
% the five times logic again, only the operation itself:
function sayCheese
disp(''Cheese'');
end
doFiveTimes(@sayCheese);
% I don''t even need to explicitly declare a function - this is an
% anonymous function:
doFiveTimes(@() disp(''do something else''));
La documentación de Matlab tiene una descripción más completa de la sintaxis de Matlab y describe algunos otros usos para los identificadores de funciones, como las devoluciones de llamadas de gráficos.
El operador de manejo de funciones en MATLAB actúa esencialmente como un puntero a una instancia específica de una función. Algunas de las otras respuestas han discutido algunos de sus usos, pero añadiré otro uso aquí que a menudo tengo para él: mantener el acceso a las funciones que ya no están "dentro del alcance".
Por ejemplo, la siguiente función inicializa un count
valores y luego devuelve un identificador de función a un increment
función anidado:
function fHandle = start_counting(count)
disp(count);
fHandle = @increment;
function increment
count = count+1;
disp(count);
end
end
Como el increment
la función es una función anidada , solo se puede usar dentro de la función start_counting
(es decir, el espacio de trabajo de la start_counting
es su "alcance"). Sin embargo, devolviendo un manejador al increment
la función, aún puedo usarlo fuera de start_counting
, y aún conserva el acceso a las variables en el espacio de trabajo de start_counting
. Eso me permite hacer esto:
>> fh = start_counting(3); % Initialize count to 3 and return handle
3
>> fh(); % Invoke increment function using its handle
4
>> fh();
5
Observe cómo podemos seguir incrementando la cuenta a pesar de que estamos fuera de la función start_counting
. Pero puede hacer algo aún más interesante llamando nuevamente a start_counting
con un número diferente y almacenando el manejador de función en otra variable:
>> fh2 = start_counting(-4);
-4
>> fh2();
-3
>> fh2();
-2
>> fh(); % Invoke the first handle to increment
6
>> fh2(); % Invoke the second handle to increment
-1
Tenga en cuenta que estos dos contadores diferentes funcionan de forma independiente. La función maneja fh
y fh2
para diferentes instancias del increment
función con diferentes espacios de trabajo que contienen valores únicos para count
.
Además de lo anterior, el uso de identificadores de funciones junto con funciones anidadas también puede ayudar a optimizar el diseño de la GUI, como lo ilustré en esta otra publicación SO .
Los identificadores de función son una herramienta extremadamente poderosa en matlab. Un buen comienzo es leer la ayuda en línea, que le dará mucho más de lo que puedo. En el símbolo del sistema, escriba
doc function_handle
Un identificador de función es una forma simple de crear una función en una línea. Por ejemplo, supongamos que deseaba integrar numéricamente la función sin (k * x), donde k tiene algún valor externo fijo. Podría usar una función en línea, pero un identificador de función es mucho más ordenado. Definir una función
k = 2;
fofx = @(x) sin(x*k);
Ver que ahora puedo evaluar la función fofx en la línea de comando. MATLAB sabe qué es k, así que ahora podemos usar fofx como una función.
fofx(0.3)
ans =
0.564642473395035
De hecho, podemos pasar fofx, efectivamente como una variable. Por ejemplo, llamemos a quad para hacer la integración numérica. Escogeré el intervalo [0, pi / 2].
quad(fofx,0,pi/2)
ans =
0.999999998199215
Como puede ver, quad hizo la integración numérica. (Por cierto, una función en línea habría sido al menos un orden de magnitud más lenta y mucho menos fácil de usar).
x = linspace(0,pi,1000);
tic,y = fofx(x);toc
Elapsed time is 0.000493 seconds.
A modo de comparación, prueba una función en línea.
finline = inline(''sin(x*k)'',''x'',''k'');
tic,y = finline(x,2);toc
Elapsed time is 0.002546 seconds.
Una cosa clara sobre un manejador de función es que puedes definirlo sobre la marcha. Minimice la función cos (x), durante el intervalo [0,2 * pi]?
xmin = fminbnd(@(x) cos(x),0,2*pi)
xmin =
3.14159265358979
Hay muchos, muchos otros usos para identificadores de función en MATLAB. Solo arañé la superficie aquí.