Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中正弦/余弦的快速逼近_Matlab_Approximation_Function Approximation - Fatal编程技术网

MATLAB中正弦/余弦的快速逼近

MATLAB中正弦/余弦的快速逼近,matlab,approximation,function-approximation,Matlab,Approximation,Function Approximation,我试图在MATLAB中创建一个快速近似的正弦和余弦,这是我的程序目前的瓶颈。有没有比内置例程更快的方法 瓶颈:在每次迭代中,从复稀疏矩阵A(50000 x 50000)和列向量b和c(50000 x 1)中获取角度,然后找到 S=[sin(ang(diag(A)+b-c) cos(ang(diag(A)+b-c)]; sin和cos的所有输入都接近+pi/2或-pi/2 我尝试了查找表(如中所示)和简单的泰勒级数,但两者都比较慢: 查找表: appr=[round(1:.001:2,3);si

我试图在MATLAB中创建一个快速近似的正弦和余弦,这是我的程序目前的瓶颈。有没有比内置例程更快的方法

瓶颈:在每次迭代中,从复稀疏矩阵A(50000 x 50000)和列向量b和c(50000 x 1)中获取角度,然后找到

S=[sin(ang(diag(A)+b-c) cos(ang(diag(A)+b-c)];
sin和cos的所有输入都接近+pi/2或-pi/2

我尝试了查找表(如中所示)和简单的泰勒级数,但两者都比较慢:

查找表:

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接近零所需的象限旋转)

在Matlab2016a、Windows 8.1、i7上平均时间-4500U@1.86GHz: 内置sin/cos:1.5秒|查找表: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;
运行时间为0.129710秒

运行时间为0.757102秒

时间实际上是由记忆中矩阵的移动所支配的


根据代码的具体性质,gpu工具箱可能是一个选项。

您正在使用内置的
sin
cos
函数来近似
sin
cos
函数?能否向我们展示您在每种情况下用于测试此功能的完整代码?更仔细地运行探查器表明,主要的时间消耗是angle()函数,但这和罪恶/罪恶是同一条线。执行之前的角度(A)并使用保存的值可节省50%的时间X 50+次迭代。谢谢
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;
tic;
S = sin(angle(C) + B - C);
toc;