【问题标题】:How to vectorize double loop in Matlab?如何在 Matlab 中矢量化双循环?
【发布时间】:2013-06-27 14:30:02
【问题描述】:
y = 0;

for m = 0:variable
  for n = 0:m
    y = y + f(n,m);
  end
end

我用这种方式矢量化了内循环,

y = 0;

for m = 0:variable
  n = 0:m
  y = y + f(n,m);
end

这使我的代码速度提高了大约 60%。如何也向量化外循环?

【问题讨论】:

  • 你的循环相当于简单的y = f(variable, variable)...你确定你不是要分配给y(m+1)...吗?
  • 你不断地用 f 的输出覆盖 y,所以只有最后的迭代会做任何事情。 f 是数组还是函数?如果是一个函数,那么如何“向量化”完全取决于 f 正在做什么。
  • 你能提供更多关于你的函数f的细节吗?两个参数都可以是向量吗?有什么限制?如果将向量参数传递给f,它的输出是什么?
  • 它总是取决于你的问题,如果你可以用向量操作代替循环。正如有人所说:你真正的问题是什么?
  • 感谢您指出错误。我已经编辑了问题。

标签: matlab vectorization nested-loops


【解决方案1】:

您可能正在寻找meshgrid 函数。它旨在填充您需要的 m x n 组合。例如:

>> m = 1:4;
>> n = 1:3;
>> [mGridValues, nGridValues] = meshgrid(m,n)
mGridValues =
     1     2     3     4
     1     2     3     4
     1     2     3     4
nGridValues =
     1     1     1     1
     2     2     2     2
     3     3     3     3

这有点复杂,因为您的内循环取决于外循环的值。所以你需要屏蔽掉不需要的 [n, m] 对(见下文)。

修改你提供的原型代码,你会得到这样的结果:

[mValues, nValues] = meshgrid(0:variable, 0:variable);  %Start with a full combination of values

mask = mValues >= nValues;  %Identify all values where m >= n
mValues = mValues(mask);    %    And then remove pairs which do not
nValues = nValues(mask);    %    meet this criteria

y = f(nValues, mValues );   %Perform whatever work you are performing here

【讨论】:

  • 是的,这就是我要找的!杰出的! +1 并被接受。
  • 根据您的循环,所有这些代码减少了多少时间...?
猜你喜欢
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多