2010-09-09 15 views

Respuesta

3

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.

4

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.

Cuestiones relacionadas