MATLAB中sin / cos的快速逼近

时间:2017-03-28 06:40:11

标签: matlab approximation function-approximation

我试图在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。

我尝试了一个查找表(如Create sine lookup table in 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秒

1 个答案:

答案 0 :(得分:1)

尝试优化sin()和cos()(已经针对刀柄进行了优化)不会给你带来太多好处。无论如何,在你的表达中:

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

其他操作将花费与sin和cos相当的时间。您是否通过将表达式拆分为其成分来运行探查器?这应该让你知道sin()和cos()的相对成本是多少。

例如:

A = pi*rand(10^7,1);
B = pi*rand(10^7,1);
C = A + i*B; % i is sqrt(-1)

tic;
S = sin(A);
toc;
  
    

经过的时间是0.129710秒。

  
tic;
S = sin(angle(C) + B - C);
toc;
  
    

经过的时间是0.757102秒。

  

真正的时间主要来自于矩阵在记忆中的移动。

根据代码的确切性质,可以选择使用gpu工具箱。