2010-09-14 9 views
29

Tengo una función que devuelve dos valores, así:¿Cómo obtengo el segundo valor de retorno de una función sin usar variables temporales?

[a b] = myfunc(x) 

¿Hay una manera de conseguir el segundo valor de retorno sin necesidad de utilizar una variable temporal, y sin alterar la función?

Lo que estoy buscando es algo como esto:

abs(secondreturnvalue(myfunc(x))) 
+0

¿Qué ocurre con el uso de una clase en lugar de una función con los métodos 'getter' correspondientes. Puede obtener algo como abs (myfunc.secondReturnValue (x)). – zellus

+0

Subiendo como una solicitud de pseudo-función a MathWorks. –

Respuesta

16

A menos que haya una necesidad apremiante de hacer esto, probablemente desaconsejaría. La claridad de tu código sufrirá. Almacenar las salidas en variables temporales y luego pasar estas variables a otra función hará que su código sea más limpio, y las diferentes maneras en que puede hacer esto se describen aquí: How to elegantly ignore some return values of a MATLAB function?.

Sin embargo, si realmente quiere o necesita hacer esto, la única manera factible que se me ocurre sería la creación de su propia función secondreturnvalue. He aquí un ejemplo más general llamado nth_output:

function value = nth_output(N,fcn,varargin) 
    [value{1:N}] = fcn(varargin{:}); 
    value = value{N}; 
end 

Y lo llamaría al pasar como entradas 1) el número argumento de salida que desee, 2) un function handle a myfunc, y 3) cualquier argumento de entrada que necesita para pasar a myfunc:

abs(nth_output(2,@myfunc,x)) 
27

no que yo sepa. subsref no parece funcionar en este caso, posiblemente porque la segunda variable ni siquiera se devuelve desde la función.

desde 2009b MATLAB es posible utilizar la notación

[~, b] = function(x) 

si no es necesario el primer argumento, pero esto todavía utiliza una variable temporal para b.

Cuestiones relacionadas