matlab卷积“相同”到numpy.convolve

时间:2016-07-05 02:12:55

标签: python matlab numpy

我注意到当我在matlab中使用conv(a,b,'same')时,它会返回长度为200的M,但是当我使用numpy.convolve(a,b,'same')时它会返回长度为200的N,但与M相比移位了一个元素(N [1:]与M [0:-1]相同,M [-1]不在N中,N [0]不在M中),我该如何解决这个问题?

我可以切断N的第一个元素,但有没有办法可以获得M的最后一个元素,而不会遇到一些麻烦?

1 个答案:

答案 0 :(得分:4)

我的猜测是较短输入数组的长度是偶数。在这种情况下,当方法“相同”时应该如何处理它是模糊的。显然Matlab和numpy采用了不同的约定。

在Matlab文档网页(http://www.mathworks.com/help/matlab/ref/conv.html)上有一个使用'same'方法的例子:

> u = [-1 2 3 -2 0 1 2];
> v = [2 4 -1 1];
> w = conv(u,v,'same')

w =

    15     5    -9     7     6     7    -1

第一个词15是(1)*(0) + (-1)*(-1) + (4)*(2) + (2)*(3),最后一个词-1是(1)*(1) + (-1)*(2) + (4)*(0) + (2)*(0)。您可以将其解释为填充u为[0 -1 2 3 -2 0 1 2 0 0],然后使用“有效”方法。

numpy:

In [24]: u
Out[24]: array([-1,  2,  3, -2,  0,  1,  2])

In [25]: v
Out[25]: array([ 2,  4, -1,  1])

In [26]: np.convolve(u, v, 'same')
Out[26]: array([ 0, 15,  5, -9,  7,  6,  7])

第一个词0是(1)*(0) + (-1)*(0) + (4)*(-1) + (2)*(2),最后一个词7是(1)*(0) + (-1)*(1) + (4)*(2) + (2)*(0)。该结果可以解释为填充u为[0,0,-1,2,3,-2,0,1,2,0],然后使用'有效'方法。

通过考虑“相同”方法,等同于用p零填充较长的参数(其中p比短输入的长度小1)然后应用'有效' '方法,你可以看到当p是奇数时(即较短的长度是偶数),需要选择哪一端得到额外的0. Matlab和numpy使用不同的选择。

要实现“相同”方法的Matlab版本,您可以自己进行填充并使用np.convolve的“有效”方法。例如,

In [45]: npad = len(v) - 1

In [46]: u_padded = np.pad(u, (npad//2, npad - npad//2), mode='constant')

In [47]: np.convolve(u_padded, v, 'valid')
Out[47]: array([15,  5, -9,  7,  6,  7, -1])

或者你可以应用'full'方法,然后切出相当于Matlab'相同'方法的部分:

In [62]: npad = len(v) - 1

In [63]: full = np.convolve(u, v, 'full')

In [64]: first = npad - npad//2

In [65]: full[first:first+len(u)]
Out[65]: array([15,  5, -9,  7,  6,  7, -1])

其他实现是可能的。使用哪一个取决于您希望避免多少复制,额外的内存使用和额外的计算。

如果较短的输入数组具有奇数长度,则Matlab和numpy中的结果应该相同。