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)

whereは関数mySignのようにsign機能しますが、引数がゼロの場合は 1 を返します。

の明示的な表現が見つかった場合は、それを上記sigmaの明示的な表現に挿入できますout_angle。その後、(ほとんどの場合) コードをベクトル化できます。

于 2012-08-09T10:12:30.257 に答える