MATLAB:如何在输入向量的所有可能组合上评估具有多个输入的函数

时间:2015-05-08 18:27:43

标签: matlab

假设我有一个带三个输入的简单功能

f = @(a,b,c) a+b+c

我想在输入组合

上评估此功能
A = 1:10
B = 2:2:10
C = 0.1:0.1:1

并将输出存储在矩阵F中。

现在我这样做如下:

F = NaN(length(A),length(B),length(C));

for ia = 1:length(A)
   for ib = 1:length(B)
     for ic = 1:length(C)
        F(ia,ib,ic) = f(A(ia),B(ib),C(ic))
     end
   end
end

我想知道是否有一种有效的方法可以在不使用sloppy for循环的情况下执行此操作*,而无需对函数f进行矢量化。

1 个答案:

答案 0 :(得分:4)

如果您需要简洁的语法并且不在乎内存或速度,可以使用:

  1. ndgrid生成所有组合;然后
  2. arrayfun在每个组合上致电f
  3. 第二步利用了这样一个事实,即可以使用几个数组作为输入调用arrayfun,在这种情况下,它会从每个数组中获取相应的元素:

    [aa, bb, cc] = ndgrid(A,B,C);        %// step 1
    result = arrayfun(f, aa, bb, cc);    %// step 2
    

    至于我上面提到的记忆和速度问题:

    • 如果输入向量很大,步骤1需要相当多的内存,因为所有组合都是一次生成的。
    • 与使用for循环相比,第2步可能导致代码更慢;例如,请参阅here