Пропуск выходных данных с анонимной функцией в MATLAB

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

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

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

person Jonas    schedule 22.06.2010    source источник


Ответы (2)


Я не знаю, что такое внутри выражения анонимная функция, чтобы она выбирала, какие выходные данные возвращать из функции с несколькими возможными выходными аргументами. Однако вы можете вернуть несколько выходных данных при вычислении анонимной функции. Вот пример использования функции 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)

Кроме того, лучший способ справиться с конкретным примером, который вы привели выше, — это просто использовать дескриптор функции @ttest2 в качестве входных данных для CELLFUN, затем получите несколько выходных данных от CELLFUN себя:

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

В более новых версиях MATLAB вы можете заменить переменную junk на ~, чтобы игнорировать первый выходной аргумент.

person gnovice    schedule 22.06.2010
comment
Другими словами, мне нужно написать функцию-оболочку. Спасибо за разъяснения! Также: Поздравляю с 20к! - person Jonas; 24.06.2010
comment
@Jonas: Спасибо и поздравляю с серебряным значком MATLAB! - person gnovice; 25.06.2010

Один из способов сделать это — определить функцию:

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

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

person Yishai Shimoni    schedule 28.08.2012