2010-06-22 1 views
16

Dire che voglio creare una funzione anonima da una funzione m-file che restituisce due uscite. È possibile impostare la funzione anonima in modo tale che restituisca solo il secondo output dalla funzione m-file?Saltare uscite con funzione anonima in MATLAB

Esempio: ttest2 restituisce due uscite, t/f e una probabilità. Se voglio usare il t-test con cellfun, potrei essere solo interessato a raccogliere le probabilità, vale a dire mi piacerebbe scrivere qualcosa del genere

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

risposta

14

Non c'è modo che io conosca all'interno dell'espressione di anonymous function per selezionare quale output restituire da una funzione con più possibili argomenti di output. Tuttavia, è possibile restituire più output quando si valuta la funzione anonima. Ecco un esempio utilizzando la funzione 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) 

Inoltre, il modo migliore per gestire l'esempio specifico si dà sopra è in realtà basta usare la function handle@ttest2 come input per CELLFUN, quindi ottenere le uscite multiple da CELLFUN sé :

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

sulle versioni più recenti di MATLAB, è possibile sostituire la variabile junk con ~ di ignorare il primo argomento di uscita.

+0

In altre parole, ho bisogno di scrivere una funzione wrapper. Grazie per il chiarimento! Inoltre: Congratulazioni per 20k! – Jonas

+0

@ Jonas: Grazie e congratulazioni per il badge argento MATLAB! – gnovice

4

Un modo per farlo è quello di definire la funzione:

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

e poi getOutput(@ttest2,2,u,v) fornisce solo il p-value.

Per utilizzarlo in un cellfun si avrebbe bisogno di correre:

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

Questo elimina la necessità di scrivere un wrapper ogni volta, ma poi bisogna assicurarsi che questa funzione è sempre nel percorso.