puntos - Saltar salidas con función anónima en MATLAB
plot matlab (2)
Digamos que quiero crear una función anónima a partir de una función de archivo-m que devuelve dos salidas. ¿Es posible configurar la función anónima de modo que solo devuelva la segunda salida de la función m-file?
Ejemplo: ttest2
devuelve dos salidas, t / f y una probabilidad. Si quiero usar la prueba t con cellfun
, quizás solo me interese recopilar las probabilidades, es decir, me gustaría escribir algo como esto
probabilities = cellfun(@(u,v)ttest2(u,v)%take only second output%,cellArray1,cellArray2)
No hay forma de saberlo dentro de la expresión de la función anónima para que seleccione qué salida devolver desde una función con múltiples argumentos de salida posibles. Sin embargo, puede devolver varias salidas cuando evalúa la función anónima. Aquí hay un ejemplo usando 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 que @ttest2
anteriormente es simplemente usar la función handle @ttest2
como entrada para CELLFUN , y luego obtener las múltiples salidas de CELLFUN sí:
[junk,probabilities] = cellfun(@ttest2,cellArray1,cellArray2);
En las versiones más recientes de MATLAB, puede reemplazar la variable junk
con ~
para ignorar el primer argumento de salida.
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)
proporciona solo el p-value
.
Para usarlo en un cellfun
necesitarías ejecutar:
probabilities = cellfun(@(u,v)getOutput(@ttest2,2,u,v)...
Esto elimina la necesidad de escribir una envoltura cada vez, pero luego debe asegurarse de que esta función esté siempre en la ruta.