【问题标题】:MATLAB: How to evaluate a function with multiple inputs on all possible combinations of input vectorsMATLAB:如何在输入向量的所有可能组合上评估具有多个输入的函数
【发布时间】:2015-05-08 18:27:42
【问题描述】:

假设我有一个带有三个输入的简单函数

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

我想知道是否有一种有效的方法可以做到这一点,而无需使用草率的 for 循环,*并且不必对函数 f 进行矢量化。

【问题讨论】:

  • 在我看来,摆脱循环和矢量化f 本质上是一回事。您可以将bsxfun 与自定义非矢量化函数一起使用,但我怀疑它会比循环更快
  • 您可以将meshgrid 用于A,B,C,然后只使用一个循环。它效率不高,但可能看起来更聪明!
  • @LuisMendo 怎么样?这次速度不是问题,我只是想要更简洁的语法:-)
  • @Kamtal 你能同时使用meshgridbsxfun 吗?
  • 如果不是为了速度,你为什么要这样做?

标签: matlab


【解决方案1】:

如果你想要简洁的语法并且不太关心内存或速度,你可以使用:

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

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

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

至于我上面提到的内存和速度问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 2016-06-10
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多