2010-06-22 16 views
16

Digamos que quiero crear una función anónima a partir de una función m-file que devuelve dos salidas. ¿Es posible configurar la función anónima de modo que solo devuelva el segundo resultado de la función m-file-function?Omisión de salidas con función anónima en MATLAB

Ejemplo: ttest2 devuelve dos salidas, t/fy una probabilidad. Si quiero usar la prueba t con cellfun, lo único que podría estar interesado en la recogida de las probabilidades, es decir, me gustaría escribir algo como esto

probabilities = cellfun(@(u,v)ttest2(u,v)%take only second output%,cellArray1,cellArray2) 

Respuesta

14

No hay manera de que sé de dentro de la expresión del anonymous function para que seleccione qué salida devolver de una función con múltiples argumentos de salida posibles. Sin embargo, usted puede devolver múltiples salidas cuando evalúe la función anónima. He aquí un ejemplo utilizando la función MAX:

>> data = [1 3 2 5 4]; %# Sample data 
>> fcn = @(x) max(x); %# An anonymous function with multiple possible outputs 
>> [maxValue,maxIndex] = fcn(data) %# Get two outputs when evaluating fcn 

maxValue = 

    5   %# The maximum value (output 1 from max) 


maxIndex = 

    4   %# The index of the maximum value (output 2 from max) 

Además, la mejor manera de manejar el ejemplo específico le das más arriba es en realidad sólo tiene que utilizar el function handle@ttest2 como la entrada a CELLFUN, a continuación, obtener las múltiples salidas de CELLFUN propio :

[junk,probabilities] = cellfun(@ttest2,cellArray1,cellArray2); 

en las nuevas versiones de MATLAB, puede reemplazar la variable junk con ~ ignorar el primer argumento de salida.

+0

En otras palabras, necesito escribir una función de envoltura. ¡Gracias por la aclaración! Además: ¡Felicidades por 20k! – Jonas

+0

@Jonas: ¡Gracias y felicitaciones por la insignia plateada de MATLAB! – gnovice

4

Una forma de hacer esto es definir la función:

function varargout = getOutput(func,outputNo,varargin) 
    varargout = cell(max(outputNo),1); 
    [varargout{:}] = func(varargin{:}); 
    varargout = varargout(outputNo); 
end 

y luego getOutput(@ttest2,2,u,v) da sólo el p-value.

Para usarlo en un cellfun que se necesita para funcionar:

probabilities = cellfun(@(u,v)getOutput(@ttest2,2,u,v)... 

Esto elimina la necesidad de escribir un contenedor cada vez, pero entonces usted tiene que asegurarse de que esta función está siempre en el camino.

Cuestiones relacionadas