【问题标题】:Optimization of double loop双循环优化
【发布时间】:2014-05-12 07:20:15
【问题描述】:

我已经编写了一个我必须控制的代码,如果位置 (x,y)(保存在矩阵垫中)位于以 (posx,posy) 为中心的圆形对象内。如果是这样,该点将获得值 val 否则为零。
我的代码看起来像这样,但事实上它被宣传为不在 matlab 中使用循环。由于我使用的不是 1 个而是 2 个循环,我想知道是否有更有效的方法来解决我的问题。

Mat = zeros(300); %creates my coordinate system with zeros
...
for i =lowlimitx:highlimitx %variable boundary of my object
   for j=lowlimity:highlimity
      helpsqrdstnc = abs(posx-i)^2 + abs(posy-j)^2; %square distance from center
      if helpsqrdstnc < radius^2
         Mat(i,j)= val(helpsqrdstnc); 
       end
   end
end

【问题讨论】:

    标签: matlab optimization for-loop


    【解决方案1】:

    优化 matlab 代码的常用方法是向量化操作。这是因为内置函数和运算符通常要快得多。对于您的情况,这将为您留下以下代码:

    Mat = zeros(300); %creates my coordinate system with zeros
    ...
    xSq = abs(posx-(lowlimitx:highlimitx)).^2;
    ySq = abs(posy-(lowlimity:highlimity)).^2;
    
    helpsqrdstnc = bsxfun(@plus,xSq,ySq.'); %bsxfun to do [xSq(1)+ySq(1),xSq(2)+ySq(1),...; xSq(1)+ySq(2),xSq(2)+ySq(2)...; ...]
    Mat(helpsqrdstnc < radius^2)= val(helpsqrdstnc(helpsqrdstnc < radius^2)); 
    

    其中helpsqrdstnc 的大小必须与 Mat 相同。此处可能还需要进行 reshape,但如果您获得列向量,您会自己注意到这一点。

    这当然假设radiusposxposy 是不变的,但阅读问题似乎就是这种情况。但是,我不确切知道 val 的外观,所以我没有设法测试代码。我也认为val(helpsqrdstnc) 很乏味,因为它指的是距离,它不一定是整数。

    【讨论】:

    • helsqrdstnc 的大小不会与Mat 不同吗? @The Minion 的注释:如今,Matlab 中的 for 循环不一定不好,JIT 编译非常擅长处理 for 循环,在某些情况下矢量化会减慢代码速度!值得确认的是,这个向量化代码确实比 for 循环版本更快(特别是内存使用会减慢向量化代码的速度)。
    • 是的,我同意,尤其是对于较小的向量,但情况并非总是如此(因为它曾经没有 JIT),所以如果可能的话,总是值得检查以确保。
    • @David 我使用 matlab 版本 R2013a,我的经验是在几乎所有情况下都应该避免 for 循环,这就是这种情况。关于矩阵的大小,我明白你的意思,我将编辑代码。感谢您指出。
    • @David 我明白你的意思。我想比较这两种方法的运行时是有意义的。正如我之前提到的,我猜这段代码在向量化后会运行得更快,尤其是因为大多数使用内置运算符,但在测试代码之前你永远不能确定+1
    • @patrik 我尝试了一些meshgrid 技术-[xv1,xv2] = meshgrid(lowlimitx:highlimitx,lowlimity:highlimity), helpsqrdstnc = abs(posx-xv2).^2 + abs(posy-xv1).^2。不确定这是否比bsxfun 快,这绝对看起来很甜蜜! +1
    猜你喜欢
    • 2018-12-16
    • 2015-07-24
    • 2016-07-14
    • 1970-01-01
    • 2021-01-27
    • 2016-12-08
    • 1970-01-01
    • 2017-07-20
    相关资源
    最近更新 更多