【问题标题】:Call multiple functions from cells in MATLAB从 MATLAB 中的单元格调用多个函数
【发布时间】:2015-02-02 08:05:59
【问题描述】:

我在单元格中存储了一些功能,例如f = {@sin, @cos, @(x)x+4}

是否可以同时调用所有这些函数(使用相同的输入)。我的意思是比使用循环更有效。

【问题讨论】:

    标签: matlab cell-array function-handle


    【解决方案1】:

    正如所构建的那样,*fun 系列函数就是为此目的而存在的(例如,cellfun 就是这里的相关函数)。它们是关于这些函数的useperformance 的其他问题。

    但是,如果您将f 构造为将元胞数组构造为的函数

    f = @(x) {sin(x), cos(x), x+4};
    

    然后您可以更自然地调用该函数:例如f([1,2,3])。 此方法还避免了 cellfun 对于非标量参数所需的 ('UniformOutput',false) 选项对。

    您也可以使用常规双精度数组,但您需要注意用于连接目的的输入形状:@(x) [sin(x), cos(x), x+4]@(x) [sin(x); cos(x); x+4]

    【讨论】:

    • 不错 =) +1!我提供了一些基准测试结果,表明您的方法确实很快(并且循环并没有那么慢)! =)
    【解决方案2】:

    我只是在这里发布这些基准测试结果,只是为了说明循环不一定比其他方法慢:

    f = {@sin, @cos, @(x)x+4};
    x = 1:100;
    tic
    for ii = 1:1000
        for jj = 1:numel(f)
            res{jj} = f{jj}(x);
        end
    end
    toc
    
    tic
    for ii = 1:1000
        res = cellfun(@(arg) arg(x),functions,'uni',0);
    end
    toc
    
    Elapsed time is 0.042201 seconds.
    Elapsed time is 0.179229 seconds.
    

    Troy 的答案几乎是循环方法的两倍:

    tic
    for ii = 1:1000
        res = f((1:100).');
    end
    toc
    Elapsed time is 0.025378 seconds.
    

    【讨论】:

      【解决方案3】:

      这可能会解决问题

      functions = {@(arg) sin(arg),@(arg) sqrt(arg)}
      x = 5;
      cellfun(@(arg) arg(x),functions)
      

      希望这会有所帮助。

      阿德里安。

      【讨论】:

      • 它可以工作,但它的速度大约是使用常规循环的 4 倍。
      猜你喜欢
      • 2015-09-13
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 2011-07-30
      • 1970-01-01
      • 2012-07-12
      相关资源
      最近更新 更多