【问题标题】:Matlab nested for loop into vectorisationMatlab嵌套for循环进入向量化
【发布时间】:2013-12-06 15:47:30
【问题描述】:

如果我有一个带有嵌套for 循环的for 循环,使用一个for 循环将值输入到方阵中,循环通过我的Y 轴,另一个循环通过我的X 轴

如何将其更改为矢量化以提高效率

g=zeros(f);

%y loop
for u = 1:f
    %x loop
    for v = 1:f
        g(u,v) = exp(-(((u-u0)^2)+((v-u0)^2))/(2*(sigma^2)))  
    end
end

【问题讨论】:

  • 要矢量化,需要了解calculation。除此之外,您的代码无效,缺少end
  • 我的代码是这样工作的,这只是我的完整示例,我只是想将工作 if 语句更改为矢量化
  • 我假设你的意思是 FOR 循环,而不是 IF 语句
  • 是编辑添加计算和是的循环
  • 你的 u 和 v 变量是矢量化的。你想矢量化 g 的计算吗?你能显示完整的代码吗?我们会更好地了解您这样做的目的。

标签: matlab for-loop nested vectorization


【解决方案1】:

使用meshgrid

 [u v] = meshgrid(1:f);
 g = exp(-(((u-u0).^2)+((v-u0).^2))/(2*(sigma^2))) ;

这假设sigmau0 等是标量...

【讨论】:

  • u0 是一个大小为 f 的向量
  • 再次检查一下,如果是这样,您问题中的代码无效。你想在这里做什么?二维高斯或其他?相应地编辑您的问题。
【解决方案2】:

您可以用以下内容替换您的 for 循环:

u = ((1:f) - u0).^2;
v = ((1:f) - v0).^2;
g = exp(-bsxfun(@plus,u',v)/(2*sigma^2));

编辑:

在最新版本的 MATLAB(R2016b 和更高版本)中,您可以在不使用 bsxfun 的情况下计算此值,因为 MATLAB 执行了新的隐式扩展:

u = ((1:f) - u0).^2;
v = ((1:f) - v0).^2;
g = exp((u'+v)/(2*sigma^2));

这应该in theorybsxfun 一样快,如果不快的话。

【讨论】:

  • 我看到了,比你快 12 秒 :D
  • 我认为你需要转置u,而不是v。当然在这种情况下没关系,因为两个向量是相同的(如果 v0 等于 u0 就像在 OP 中一样)
  • 很好的定位。固定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 2013-03-03
相关资源
最近更新 更多