对于奇整数T和S,Array 1和Array 2都是形状的二维数组(T,S),表示函数func 1的样本(t,s)和函数2(t,s),它位于由T x S个点组成的等间距格L上,从t=0延伸到t=1,从s=-10延伸到s=10。我希望得到第三个Array 3,其形状为(T,S),其取值为该格上的func 3(t,s),其中func 3(t,s)是在所有q和p上的func 1(q,p)* func 2(t-q,s-p)的和,使得(q,p)和(t-q,s-p)都在格L上。
我目前的工作方法是用0填充Array 2,以创建形状为的ExtendedArray 2(2 T-1,2S-1),使得扩展数组2 [[(T-1)+x](S-1)+y]=数组2 [x][y],其中0 ≦ x ≦ T-1且0 ≦ y ≦ S-1,我使用scipy中的信号以下面的方式对Array 1和ExtendedArray 2进行卷积,以得到我想要的结果。
Array3 = signal.fftconvolve(Array1, ExtendedArray2, mode='valid')
fftconvolve的速度相当快,但这种方法的缺点是它需要将输入数组的维数加倍,这使得速度比在较小的数组上要慢。有没有一种方法可以在未填充的数组上使用速度高效的卷积方法来获得Array 3?
2条答案
按热度按时间hrysbysz1#
不,没有比你正在做的更快的计算方法了,除非要利用的函数有特定的属性(例如,如果其中一个函数是可分离的)。
不过,你可以编写更快的代码。例如,你可以使用FFTW库而不是SciPy中的FFT。你还应该确保
ExtendedArray2
的大小适合FFT(即小整数的乘积)。而不是选择形状(2 T-1,2S-1),使其稍大,形成(2 T-1+n,2S-1+m),选择非负的n和m,使得2 T-1+n和2S-1+m都是例如2s、3s和5s的乘积。soat7uwm2#
对于您描述的问题,我将简单地使用
它将为您计算一个快速长度(检查此处的代码)
你能比较一下,让我们知道你看到的运行时间吗?