说我有一个简单的功能,其中三个输入
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
。
如果您想要整洁的语法并且不太在乎内存或速度,则可以使用:
-
ndgrid
生成所有组合;然后 -
arrayfun
在每种组合上调用f
:
第二步利用了可以用几个数组作为输入调用arrayfun
的事实,在这种情况下,它从每个数组中获取相应的元素:
[aa, bb, cc] = ndgrid(A,B,C); %// step 1
result = arrayfun(f, aa, bb, cc); %// step 2
至于上面提到的内存和速度关注:
- 第1步需要很多内存如果输入向量很大,因为所有组合都是一次生成。
- 步骤2可能会导致代码慢> 比使用
for
loops;例如,请参见此处。