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

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

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

  1. ndgrid生成所有组合;然后
  2. arrayfun在每种组合上调用f

第二步利用了可以用几个数组作为输入调用arrayfun的事实,在这种情况下,它从每个数组中获取相应的元素:

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

至于上面提到的内存和速度关注:

  • 第1步需要很多内存如果输入向量很大,因为所有组合都是一次生成。
  • 步骤2可能会导致代码慢> 比使用for loops;例如,请参见此处。

最新更新