0

循环如下:

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 循环?

4

1 回答 1

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,即实际上你有 sigma(j),因此

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

不幸的是,您也只有一个隐式表达式sigma,您必须以相同的方式解决它。您可能可以考虑一下背后的结构sigma。这是一个变量,1y表示负数,-1y表示正数或零,即类似于

sigma = -mySign(y)

wheremySignsign函数类似,但对于零参数给出 1。

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

于 2012-08-09T10:12:30.257 回答