我的周期性关系如下:
f_0 = s_0
f_1 = alpha * s_1 + (1 - alpha) * f_0
f_2 = alpha * s_2 + (1 - alpha) * f_1
...
f_n = alpha * s_n + (1 - alpha) * f_n-1
这很容易将其编码为for循环(示例代码)
import numpy as np
## values for example only ##
s = np.linspace(0, 10, 3000)
alpha = 1 / 5
f = s.copy()
for i in range(1, len(s)):
f[i] = alpha * s[i] + (1 - alpha) * f[i-1]
我的斗争正在寻找一种矢量化这种关系的方法。我试过对切片索引很聪明,但是类似
f[1:] = alpha * s[1:] + (1 - alpha) * f[:-1]
显然不正确,因为它不会更新f
。
有没有一种明显的方法可以向量化此递归关系?如果可能的话,我宁愿避免这种for循环,因为作为优化例程的一部分,我的代码将不得不执行数千次此操作。
谢谢!
更新
感谢您的反馈。我尝试了一个简单的numba实现@jit
,它实际上使循环快了50倍吗?作为numba的新手,是否有任何方法可以进一步调整这些结果?
答案 0 :(得分:0)
您可以将其更改为矩阵方程式。如果将f和s编写为numpy数组(1d)并编写2d numpy矩阵M,则:
F = numpy.dot(M,S)
然后,您只需创建一次矩阵(它仅取决于alpha),并且可以在其他S上继续使用它。 第一次检查时,矩阵看起来像:
|1,0,0,0|
|(1-alpha),alpha,0,0|
|(1-alpha)^2,(1-alpha),alpha,0|
|(1-alpha)^3,(1-alpha)^2,(1-alpha),alpha|