titulo puntos linea leyendas leyenda graficar grafica ejes color ajustar matlab anonymous-function

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.