如何使用查找有效地替换函数?

B. *_*mas 6 matlab vector matrix

我试图提高在大型数据集上运行的代码的速度.我需要执行该功能out = sinc(x),其中x2048 -by- 37499双打矩阵.这是非常昂贵的,并且是我的程序的瓶颈(即使在GPU上计算).

我正在寻找任何可以提高此操作速度的解决方案.我希望这可以通过预先计算矢量来实现,LookUp = sinc(y)其中矢量y是矢量y = min(min(x)):dy:max(max(x)),即跨越整个预期x元素范围的矢量.

如何有效地sinc(x)从该LookUp向量生成近似值?

我需要避免生成三维数组,因为这会消耗比我可用的内存更多的内存.

以下是interp1解决方案的测试:

a = -15;
b = 15;
rands = (b-a).*rand(1024,37499) + a;

sincx = -15:0.000005:15;
sincy = sinc(sincx);

tic
res1 = interp1(sincx,sincy,rands);
toc

tic
res2 = sinc(rands);
toc'

sincx = gpuArray(sincx);
sincy = gpuArray(sincy);
r = gpuArray(rands);

tic
r = interp1(sincx,sincy,r);
toc

r = gpuArray(rands);

tic
r = sinc(r);
toc
Run Code Online (Sandbox Code Playgroud)

经过时间为0.426091秒.
经过的时间是0.472551秒.
经过时间为0.004311秒.
经过的时间是0.130904秒.

分别对应CPU interp1,CPU sinc,GPU interp1,GPU sinc

And*_*uri 2

我找到了一种更快的方法(如果你的电脑上有 NVIDIA GPU),但是这将返回NaNx=0但如果出于任何原因,你可以处理拥有NaN或你知道它永远不会为零,那么:

如果您自己在 GPU 中定义r = gpuArray(rands);并实际评估该函数,如下所示:sinc

tic
r=rdivide(sin(pi*r),pi*r);
toc
Run Code Online (Sandbox Code Playgroud)

这通常比interp1GPU 中的版本速度快 3.2 倍,而且更准确(使用上面的代码进行测试,使用不同的随机数据迭代 100 次,两种方法都类似 std)。

这是可行的,因为sin逐元素除法rdivide也是 GPU 实现的(但由于某种原因sinc不是)。请参阅:http://uk.mathworks.com/help/distcomp/run-built-in-functions-on-a-gpu.html