【问题标题】:Skipping outputs with anonymous function in MATLAB在 MATLAB 中使用匿名函数跳过输出
【发布时间】:2010-06-22 19:03:21
【问题描述】:

假设我想从一个返回两个输出的 m 文件函数创建一个匿名函数。是否可以设置匿名函数,使其仅返回 m-file-function 的第二个输出?

示例:ttest2 返回两个输出,t/f 和一个概率。如果我想对cellfun 使用 t 检验,我可能只对收集概率感兴趣,即我想写这样的东西

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

【问题讨论】:

    标签: matlab anonymous-function


    【解决方案1】:

    我不知道在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 替换为 ~ 以忽略第一个输出参数。

    【讨论】:

    • 换句话说,我确实需要编写一个包装函数。感谢您的澄清!另外:恭喜获得 20k!
    • @Jonas:谢谢,恭喜你获得银牌 MATLAB!
    【解决方案2】:

    一种方法是定义函数:

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

    这消除了每次编写包装器的需要,但是您必须确保此函数始终在路径中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多