矢量化循环

时间:2012-08-09 05:48:53

标签: matlab

循环如下:

for j = 1:20   
  sigma = (y<0) - (y>=0);    
  x0 = x;  
  out_angle = out_angle - sigma*lut(j);  
  x = x-(y.*sigma)*poweroftwo;  
  y = y+(x0.*sigma)*poweroftwo;   
  poweroftwo = poweroftwo/2;  
end  

out_angle,x,y和sigma是dim m * n的矩阵。 lut是一个大小为20的数组.poweroftwo是一个初始值为1的标量。是否可以对此代码进行向量化并避免for循环?

1 个答案:

答案 0 :(得分:0)

此循环的矢量化缺少许多信息。请看一下

out_angle = out_angle - sigma*lut(j);

在矢量化之后,您希望有一个类似于

的表达式
out_angle(j) = out_angle(j-1) - sigma*lut(j);

您立即看到当前out_angle取决于先前计算的值。这也意味着out_angle只能按顺序计算,但除外 提出out_angle的明确表示。

out_angle(j) = out_angle(j-1) - sigma*lut(j)
             = out_angle(j-2) - sigma*lut(j-1) - sigma*lut(j)
             = out_angle(j-3) - sigma*lut(j-2) - sigma*lut(j-1) - sigma*lut(j)
             = ...
             = out_angle(0) - sum_{k = 0}^j (sigma*lut(k))

事情变得更复杂,因为sigma也取决于j,即实际上你有。{1}} sigma(j)因此

out_angle(j) = out_angle(0) - sum_{k = 0}^j (sigma(k)*lut(k))

不幸的是,您还必须使用sigma的隐式表达式 以同样的方式解决。你可以想一想sigma背后的结构。这是一个变量,为1,其中y为负数,-1为y为正数 或零,即它类似于

sigma = -mySign(y)

其中mySign的行为与sign函数类似,但为零参数赋予1。

如果您可以找到sigma的明确表示,则可以将其插入上面out_angle的显式表示中。之后,您可以(很可能)对代码进行矢量化。