Пропуск выходов с анонимной функцией в MATLAB
Скажем, я хочу создать анонимную функцию из m-file-функции, которая возвращает два выхода. Можно ли настроить анонимную функцию таким образом, чтобы она возвращала только второй вывод из функции m-file?
Пример: ttest2
возвращает два выхода, t / f и вероятность. Если я хочу использовать t-тест с cellfun
, мне может быть интересно только собирать вероятности, то есть я бы хотел написать что-то вроде этого
probabilities = cellfun(@(u,v)ttest2(u,v)%take only second output%,cellArray1,cellArray2)
- Анонимный экземпляр classа - это плохая идея?
- Анонимные функции с использованием выражений операторов GCC
- Scala подчеркивает минимальную функцию
- Как выполнить несколько операторов в анонимной функции MATLAB?
- Рекурсивная анонимная функция Matlab
Я не знаю, как это сделать в выражении анонимной функции, чтобы выбрать, какой вывод следует возвращать из функции с несколькими возможными выходными аргументами. Однако при оценке анонимной функции вы можете возвращать несколько выходов. Вот пример использования функции 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)
Кроме того, лучший способ справиться с конкретным примером, приведенным выше, состоит в том, чтобы фактически использовать функцию handle @ttest2
в качестве входа в CELLFUN , а затем получить несколько выходов непосредственно из CELLFUN :
[junk,probabilities] = cellfun(@ttest2,cellArray1,cellArray2);
В более новых версиях MATLAB вы можете заменить переменную junk
на ~
чтобы игнорировать первый выходной аргумент.
Один из способов сделать это – определить функцию:
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)...
Это устраняет необходимость писать оболочку каждый раз, но тогда вы должны убедиться, что эта функция всегда находится на пути.