我正在使用R 3.6.2 (平台 = x86_64-w64-mingw32)。
在下面两个多项式系数向量的卷积中,我希望第一个条目完全是1.0,但 convolve
函数不同:
g <- c(1, -49, 1155, -17441, 189700, -1583071, 10545901, -57608692,
263063351, -1018546561, 3380085631, -9693547553, 24176423345,
-52691112850)
u <- c(1, -6, 11, -6)
convolve(g, rev(u), type = 'o')
# output
[1] 1.000172e+00 -5.500020e+01 1.460000e+03 -2.491600e+04
[5] 3.073450e+05 -2.920052e+06 2.223567e+07 -1.394361e+08
[9] 7.342188e+08 -3.293898e+09 1.273071e+10 -4.275645e+10
[13] 1.256299e+11 -3.246592e+11 6.402486e+11 -7.246608e+11
[17] 3.161467e+11
请注意,结果中的第一个条目为1.000172,而不是1.0。在Python 3.7.4中执行相同的卷积会得到预期的答案。
import numpy as np
g = [1, -49, 1155, -17441, 189700, -1583071, 10545901, -57608692, 263063351, -1018546561, 3380085631, -9693547553, 24176423345, -52691112850]
u = [1, -6, 11, -6]
np.convolve(g,u)
array([ 1, -55, 1460, -24916,
307345, -2920052, 22235673, -139436079,
734218840, -3293897685, 12730714010, -42756453616,
125629929970, -324659189789, 640248619213, -724660781420,
316146677100], dtype=int64)
当我使用来自Rcpp文档的convolveCpp
示例时,我得到了与上面Python代码中相同的结果。
convolve
或其底层的fft
是否存在舍入或精度问题?
from scipy import signal
signal.fftconvolve(g, u)
也会给出一个近似的答案,它也使用了“fft”。 - Basconvolve(c(1, 2), c(3, 4), type="open")
就足以显示convolve
的结果与多项式卷积不同--convolve
返回c(4, 11, 6)
,而多项式卷积(例如由pracma::conv
实现)返回c(3, 10, 8)
。 - Robert Dodierconvolve
返回 [4,11,6],如果这是 R 语言,它支持 OP 的问题。也许 R 的convolve
函数有问题。 - Cris Luengo? convolve
,它说:“请注意,两个序列‘x’和‘y’的卷积的通常定义是由‘convolve(x, rev(y), type = "o")’给出的。”再一次,我没有足够的启示去阅读文档...我仍然认为这是一个非常糟糕的默认行为。 - Robert Dodier