【问题标题】:Fast approximation for sin/cos in MATLABMATLAB 中 sin/cos 的快速逼近
【发布时间】:2017-03-28 06:40:11
【问题描述】:

我正在尝试在 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 秒

【问题讨论】:

  • 您正在使用内置的sincos 函数来逼近sincos
  • 你能告诉我们你在每种情况下使用的完整代码来测试这个吗?

标签: matlab approximation function-approximation


【解决方案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 工具箱可能是一个选项。

【讨论】:

  • 更仔细地运行分析器表明主要的时间消耗是 angle() 函数,但它与 sin / cos 在同一行。执行之前的角度(A)并使用保存的值可以节省 50% 的时间 X 50+ 次迭代。谢谢!
猜你喜欢
  • 2019-08-18
  • 1970-01-01
  • 2021-08-12
  • 2016-03-15
  • 2015-06-15
  • 2021-08-13
  • 1970-01-01
  • 2017-07-21
  • 2011-01-21
相关资源
最近更新 更多