Tengo una función m-file con 4 salidas. Me gustaría definir una función anónima que tenga las mismas entradas, pero solo produce 2 de las cuatro salidas. es posible?define la función anónima como 2 de 4 salidas de la función de archivo m
Respuesta
Si las dos salidas son # 1 y # 2, todo está bien, y no tiene que preocuparse por las otras dos salidas.
Si las dos salidas son los otros dos, tiene dos opciones
(1) Crea una función de contenedor con dos salidas (tenga en cuenta que en las últimas versiones de Matlab se puede reemplazar las salidas no utilizadas dummy
por ~
.
function [out1,out2] = wrapperFunction(in1,in2,in3)
[dummy,out1,dummy,out2] = mainFunction(in1,in2,in3);
(2) Añadir otra variable de entrada que le permite cambiar el comportamiento de su función
function varargout = mainFunction(in1,in2,in3,outputSwitch)
%# make output switch optional
if nargin < 4 || isempty(outputSwitch)
outputSwitch = 0;
end
%# calculation here that creates out1-4
if outputSwitch
%# the special case where we only want outputs 2 and 4
varargout = {out2,out4};
else
%# return all four outputs
varargout = {out1,out2,out3,out4}
end
Luego puede crear la función anónima como de costumbre.
AFAIK, no se puede hacer esto solo con una función anónima en línea, porque esa sintaxis de Matlab no proporciona una forma de capturar e indexar múltiples salidas de una función en una sola expresión. Pero puede escribir un par de funciones de ayuda reutilizables que lo hagan, y luego definir funciones anónimas usándolas.
Digamos que su función de cuatro argout se llama "f4".
function varargout = f4(x)
%F4 Dummy function that returns 4 argouts holding identifying indexes
varargout = num2cell(1:4);
Aquí hay una función de ayuda reutilizable que reasigna las salidas de una llamada a función.
function varargout = callandmap(fcn, ix, varargin)
%CALLANDMAP Call a function and rearrange its output arguments
tmp = cell(1,max(ix)); % Capture up to the last argout used
[tmp{:}] = fcn(varargin{:}); % Call the original function
varargout = tmp(ix); % Remap the outputs
Ahora puede hacer anónimas funciones de reasignación de argout como esta. Aquí, g tiene una función anónima que toma las mismas entradas que su función original, pero solo devuelve 2 de sus 4 salidas originales.
>> g = @(varargin) callandmap(@f4, [2 4], varargin{:})
g =
@(varargin)callandmap(@f4,[2,4],varargin{:})
>> [a,b] = g('dummy') % gets argouts 2 and 4 from original f4() function
a =
2
b =
4
>>
El uso de varargin le permite omitir los argumentos finales cuando se invoca el identificador de la función resultante. Si sabe que siempre se proporcionarán todos los argins, puede usar los argins nombrados para la legibilidad si lo desea.
Puede obtener aún más elegante y hacer esto con un cierre.
function fcn = mapargout(fcnIn, ixArgout)
%MAPARGOUT Create wrapper function that selects or reorders argouts
%
% fcn = argoutselector(fcnIn, ixArgout)
%
% Wraps a given function handle in a function that rearranges its argouts.
% This uses closures so it may have performance impacts.
%
% FcnIn is a function handle to wrap.
%
% IxArgout is a list of indexes in to the original functions argout list
% that should be used as the outputs of the new function.
%
% Returns a function handle to a new function.
fcn = @extractor;
function varargout = extractor(varargin)
n = max(ixArgout);
tmp = cell(1,n);
% Call the wrapped function, capturing all the original argouts
[tmp{:}] = fcnIn(varargin{:});
% And then select the ones you want
varargout = tmp(ixArgout);
end
end
Esto da como resultado un código más simple para crear la función anónima. Y podría componerlo con otras llamadas al contenedor de funciones.
>> g = mapargout(@f4, [2 4])
g =
@mapargout/extractor
>> [a,b] = g('dummy')
a =
2
b =
4
>>
Pero los cierres pueden ser difíciles de manejar en Matlab y pueden tener implicaciones en el rendimiento. El enfoque de callandmap es probablemente preferible a menos que necesite la potencia extra.
- 1. Omisión de salidas con función anónima en MATLAB
- 2. Alcance de la función anónima pasada como argumento de función
- 3. PHP: Pase la función anónima como argumento
- 4. múltiples salidas de F # Función
- 5. Lambda \ Función anónima como parámetro
- 6. JavaScript: ¿Cómo pasar una función anónima como parámetro de función?
- 7. Javascript previene la función anónima?
- 8. JavaScript - Retorno de la función anónima (varScope)
- 9. rendimiento de la función anónima en PHP
- 10. Ir: transferir var a la función anónima
- 11. C#: ordenando con la función anónima
- 12. jquery declaración de función anónima significados
- 13. función pasa como argumento de la función
- 14. Nombrar una función anónima
- 15. Desvincular una función anónima
- 16. javascript onclick, función anónima
- 17. Javascript llamada a la función anónima
- 18. Cómo refactorizar esta función anónima de Javascript?
- 19. Valor de retorno de la función anónima postgresql
- 20. Cierre vs función anónima
- 21. ¿Cómo expongo la función de la función de auto invocación anónima?
- 22. La función no se define en setInterval
- 23. `cuales()` función de índices de la matriz
- 24. En clojure, ¿cómo escribir la función de identidad utilizando la función anónima literal?
- 25. función de la función de la biblioteca itertools
- 26. Limitación de la función Play 2
- 27. ¿Dónde se define la función err_sys()?
- 28. En Clojure, ¿es posible definir una función anónima dentro de una función anónima?
- 29. ¿Cómo se define la función en .emacs?
- 30. Emacs: define una función que carga el archivo donde está definida la función