双环优化

时间:2014-05-12 07:20:15

标签: matlab optimization for-loop

如果位置(x,y)(保存在Matrix Mat中)位于以(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

1 个答案:

答案 0 :(得分:3)

优化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相同。在这里也可能有一个重新整形,但如果你得到一个列向量,你会发现它自己。

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