2010-06-22 77 views
16

假設我想從一個返回兩個輸出的m文件函數創建一個匿名函數。是否可以設置匿名函數,使其僅返回m文件函數的第二個輸出?例如:ttest2返回兩個輸出,t/f和概率。如果我想使用t檢驗cellfun,我可能只興趣收集的概率,也就是我想寫這樣的事情使用MATLAB中的匿名函數跳過輸出

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

回答

14

有沒有辦法,我表達內知道anonymous function來讓它選擇從具有多個可能的輸出參數的函數返回哪個輸出。但是,你可以返回多個輸出,當你評估的匿名函數。下面是使用功能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) 

此外,處理您在上面給出的具體例子中,最好的辦法就是實際只使用function handle@ttest2作爲輸入到CELLFUN,然後從CELLFUN本身獲得多個輸出:

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

在MATLAB的新版本,你可以替換變量junk~忽略第一個輸出參數。要做到這一點

+0

換句話說,我確實需要編寫一個包裝函數。感謝您的澄清!另外:恭喜20k! – Jonas 2010-06-24 18:40:03

+0

@Jonas:謝謝,祝賀銀色的MATLAB徽章! – gnovice 2010-06-25 15:45:53

4

的一種方法是定義函數:

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

然後getOutput(@ttest2,2,u,v)只給出了p-value

要使用它在一個cellfun你需要運行:

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

這樣就不必每次都寫一個包裝,但你必須確保此功能始終在路徑。