假设我想从一个返回两个输出的 m 文件函数创建一个匿名函数。是否可以设置匿名函数,使其仅返回 m-file-function 的第二个输出?
示例:ttest2
返回两个输出,t/f 和一个概率。如果我想使用 t 检验cellfun
,我可能只对收集概率感兴趣,即我想写这样的东西
probabilities = cellfun(@(u,v)ttest2(u,v)%take only second output%,cellArray1,cellArray2)
假设我想从一个返回两个输出的 m 文件函数创建一个匿名函数。是否可以设置匿名函数,使其仅返回 m-file-function 的第二个输出?
示例:ttest2
返回两个输出,t/f 和一个概率。如果我想使用 t 检验cellfun
,我可能只对收集概率感兴趣,即我想写这样的东西
probabilities = cellfun(@(u,v)ttest2(u,v)%take only second output%,cellArray1,cellArray2)
在匿名函数的表达式中,我无法知道让它选择从具有多个可能输出参数的函数返回的输出。但是,您可以在评估匿名函数时返回多个输出。这是使用函数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
以~
忽略第一个输出参数。
一种方法是定义函数:
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
.
要在 a 中使用它,cellfun
您需要运行:
probabilities = cellfun(@(u,v)getOutput(@ttest2,2,u,v)...
这消除了每次编写包装器的需要,但是您必须确保此函数始终在路径中。