MATLAB 中 sin/cos 的快速逼近
Fast approximation for sin/cos in MATLAB
我正在尝试在 MATLAB 中创建 sin 和 cos 的快速近似值,这是我程序中当前的瓶颈。有没有比内置例程更快的方法?
瓶颈:在每次迭代中,从复杂的稀疏矩阵 A (50,000 x 50,000) 和列向量 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。
我尝试了查找 table(如 Create sine lookup table in C++ 中所建议的)和简单的泰勒级数,但两者都比较慢:
查找table:
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 秒 |查找 table:1.8 秒 |泰勒级数:1.7秒
尝试优化 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;
Elapsed time is 0.129710 seconds.
tic;
S = sin(angle(C) + B - C);
toc;
Elapsed time is 0.757102 seconds.
时间真的主要是矩阵进出内存。
根据您的代码的具体性质,gpu 工具箱可能是一个选项。
我正在尝试在 MATLAB 中创建 sin 和 cos 的快速近似值,这是我程序中当前的瓶颈。有没有比内置例程更快的方法?
瓶颈:在每次迭代中,从复杂的稀疏矩阵 A (50,000 x 50,000) 和列向量 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。
我尝试了查找 table(如 Create sine lookup table in C++ 中所建议的)和简单的泰勒级数,但两者都比较慢:
查找table:
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 秒 |查找 table:1.8 秒 |泰勒级数:1.7秒
尝试优化 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;
Elapsed time is 0.129710 seconds.
tic;
S = sin(angle(C) + B - C);
toc;
Elapsed time is 0.757102 seconds.
时间真的主要是矩阵进出内存。
根据您的代码的具体性质,gpu 工具箱可能是一个选项。