我需要计算以下卷积:
K是一个非常简单的过滤器,它只是一个有限(!)大小的矩形框。 我的数据是狄拉克三角洲时间t_i的列表。
直接的解决方案是将数据分区并使用numpy或scipys卷积函数之一。然而,有更快的方法吗?我可以避免数据的分级并利用a)我的滤波器大小有限(只是一个盒子)和b)我有一个时间点列表这一事实。因此,我只需检查我的时间点当前是否是滑动框的一部分。
所以,我正在寻找一个复杂度为O(d * n)的解决方案,其中d为卷积分辨率的大小。因此,我希望比O(b ** 2)快得多,其中b是箱数。此外,因为n <&lt; b,仍然认为对于基于fft的卷积,O(d * n)远小于O(b * log b)。谢谢!
答案 0 :(得分:1)
使用cumulative sum of the signal:
可以加快使用大型过滤器的卷积示例信号:
import numpy as np
a = np.random.rand(10)
print a
输出:
[ 0.22501645 0.46078123 0.6788864 0.88293584 0.10379173 0.50422604
0.4670648 0.22018486 0.96649785 0.44451671]
使用default convolution function进行卷积:
print np.convolve(a, np.ones(3) / 3, mode='valid')
输出:
[ 0.45489469 0.67420116 0.55520466 0.49698454 0.35836086 0.39715857
0.55124917 0.54373314]
使用累积总和进行卷积:
s = np.cumsum(np.concatenate(([0], a)))
print (s[3:] - s[:-3]) / 3
输出:
[ 0.45489469 0.67420116 0.55520466 0.49698454 0.35836086 0.39715857
0.55124917 0.54373314]
cumsum
计算和列表减法都是O(n),其中n是列表元素的数量,因此整体计算时间为O(n),并且 - 有趣的是 - 与过滤器大小无关