簡體   English   中英

matlab 卷積“相同”到 numpy.convolve

[英]matlab convolution “same” to numpy.convolve

我注意到當我在 matlab 中使用 conv(a, b, 'same') 時,它會返回長度為 200 的 M,但是當我使用 numpy.convolve(a, b, 'same') 時它會返回 N 的長度200,但與 M 相比移動了一個元素(N[1:] 將與 M[0:-1] 相同,M[-1] 不在 N 中,N[0] 不在 M 中),如何我可以解決這個問題嗎?

我可以切斷 N 的第一個元素,但是有沒有辦法可以在不經過一些麻煩的情況下獲得 M 的最后一個元素?

我的猜測是較短的輸入數組的長度是偶數。 在這種情況下,當方法“相同”時應該如何處理存在歧義。 顯然 Matlab 和 numpy 采用了不同的約定。

Matlab 文檔網頁( http://www.mathworks.com/help/matlab/ref/conv.html )上有一個使用“相同”方法的示例:

> 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],然后使用“有效”方法。

與麻木:

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] 然后使用 'valid' 方法。

通過將“相同”方法視為等效於用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])

或者您可以應用“完整”方法,然后切出與 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 中的結果應該相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM