0

MATLAB で sin と cos の高速近似を作成しようとしていますが、これが現在のプログラムのボトルネックになっています。組み込みルーチンよりも高速な方法はありますか?

ボトルネック: 各反復で、複素疎行列 A (50,000 x 50,000) と col ベクトル b および c (50,000 x 1) から角度を取得し、

S=[sin(ang(diag(A)+b-c) cos(ang(diag(A)+b-c)];

sin と cos へのすべての入力は、+pi/2 または -pi/2 に近くなります。

ルックアップ テーブル (「 C++ でサイン ルックアップ テーブルを作成する」で提案されているように) と単純なテイラー級数を試しましたが、どちらも遅くなりました。

ルックアップテーブル:

appr=[round(1:.001:2,3);sin(1:.001:2);cos(1:.001:2)];
ang=round(angle(diag(A))+b-c);
loc=ang;
for cntr=1:length(ang)
    loc(cntr)=find(appr(1,:)==abs(ang(cntr)),1);
end
S=[appr(loc,2).*sign(ang) appr(loc,3)];

テイラー級数 (ang=pi/2 をゼロに近づけるのに必要な象限回転)

ang=angle(diag(A))+b-c;
[ang,ind]=min(abs([ang+pi/2; ang-pi/2])); conv=[1 -1];
S=[(ang-0.1667*ang.^3).*conv(ind)), (1-0.5*ang.^2+0.041666*ang.^4).*conv(ind))];

MATLAB 2016a、Windows 8.1、i7-4500U@1.86GHz での平均時間: 組み込み sin/cos: 1.5 秒 | ルックアップ テーブル: 1.8 秒 | テイラー級数: 1.7 秒

4

1 に答える 1