2010-06-22 4 views
16

Скажем, я хочу создать анонимную функцию из m-file-функции, которая возвращает два выхода. Можно ли настроить анонимную функцию таким образом, чтобы она возвращала только второй вывод из функции m-file?Пропуск выходов с анонимной функцией в MATLAB

Пример: ttest2 возвращает два выхода, t/f и вероятность. Если я хочу использовать Т-тест с cellfun, я мог бы быть заинтересован только в сборе вероятностей, то есть я хотел бы написать что-то вроде этого

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

+0

@ Jonas: Спасибо, и поздравляем с серебряным значком MATLAB! – gnovice

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)... 

Это устраняет необходимость писать обертку каждый раз, но тогда вы должны убедиться, что эта функция всегда находится в пути.

Смежные вопросы