循环如下:
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循环?
答案 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
的显式表示中。之后,您可以(很可能)对代码进行矢量化。