【问题标题】:Vectorized or single line evaluation of function array in MATLABMATLAB中函数数组的矢量化或单线评估
【发布时间】:2015-08-05 13:54:21
【问题描述】:

previous question 中,一位用户询问有关迭代匿名函数元胞数组的问题。我想知道是否有一种方法可以在不显式使用 for 循环的情况下评估一组函数。

例如,以下代码创建了一个(简单)函数数组,对它们进行评估以获得固定值并存储结果:

fcnList = {@(x) (x+1), @(x) (x+2)};
a = 2;
for i = 1:numel(fcnList)
    y(i) = fcnList{i}(a);
end

有没有办法在不循环的情况下做到这一点?

【问题讨论】:

  • 我想您可以将cellfunfeval 一起使用,但我不确定为什么在这种情况下避免for 循环很重要。 cellfun 也可能更慢,但我目前没有 MATLAB 可供测试。
  • 您是对的,可能很少有使用案例可以显着加快执行速度。不过,它是在一个项目中出现的,我认为问一下也无妨。
  • 为了避免for 循环或cellfun(或多或少与循环相同),您可以使用 vector 定义 single 函数 元胞数组 输出:fcn = @(x) [x+1, x+2];fcn = @(x) {x+1, x+2};。然后fcn(a) 为您提供包含结果的向量或元胞数组。
  • @LuisMendo 这真的很有用。请将此添加为答案。
  • @RyanJ.Smith 感谢您的评论。完成

标签: matlab vectorization cell-array


【解决方案1】:

对于您的示例,您可以使用 cellfun 函数执行以下操作:

fcnList = {@(x) (x+1), @(x) (x+2)};
a = 2;
cellfun(@(func) func(a),fcnList)
ans =

   3   4

我创建了一个名为func 的句柄,它接受来自fcnList 变量的函数作为输入。然后针对a 评估每个函数。

如果您需要传递向量而不是标量,例如b,则需要将'UniformOutput' 选项设置为false

b=[3 4]
fcnList = {@(x) (x+1), @(x) (x+2)};
cellfun(@(func) func(b),fcnList,'UniformOutput',false)
ans =
{
  [1,1] =
     4   5
  [1,2] =
     5   6
}

【讨论】:

    【解决方案2】:

    为避免出现for 循环或cellfun(即more or less the same as a loop),您可以定义一个单一函数向量输出

    fcn = @(x) [x+1, x+2];
    

    然后fcn(a) 给你一个包含结果的向量:

    >> fcn = @(x) [x+1, x+2];
    >> a = 2;
    >> fcn(a)
    ans =
         3     4
    

    如果每个原始函数的结果大小不同,您可以使用元胞数组输出定义单个函数:

    >> fcn = @(x) {x+1, [x+2; x+3]};
    >> a = 2;
    >> x = fcn(a)
    x = 
        [3]    [2x1 double]
    >> celldisp(x)
    x{1} =
         3
    x{2} =
         4
         5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      相关资源
      最近更新 更多