在 Matlab 的 conv() 函数中使用 'valid' 进行卷积
Convolution using 'valid' in Matlab's conv() function
Here是给定卷积的例子:
我这里有两个问题:
为什么向量两边各补两个0?因为,kernel的长度ℎ为3,如果两边各补一个0,则卷积输出的中间元素在的长度范围,为什么不是每边一个0呢?
向我解释以下输出:
>> x = [1, 2, 1, 3];
>> h = [2, 0, 1];
>> y = conv(x, h, 'valid')
y =
3 8
>>
valid
在前面显示的向量数学 和 ℎ?[=16 的上下文中做什么=]
我不能说零填充的数量是正确的....话虽如此,任何零填充都是在弥补不存在的数据。这不一定是错误的,但您应该意识到计算此信息的值可能有偏差。有时你关心这个,有时你不关心。引入 1 个零(在这种情况下)会使中间内核值始终留在数据中,但为什么这应该是一个停止标准?重要的是,添加 2 个零仍然会留下数据和内核中实际存在的值的乘积(x[0]*h[0] 和 x[3]*h[2] - 使用基于 0 的索引)。添加第三个零(或更多)只会在输出中产生零,因为 3 是内核的长度。换句话说,对于从 n=1 到 n = length(h)-1(在本例中为 1 或 2)的任何零填充,零填充将始终产生部分基于实际数据(但不完全)的输出。
即使长度为 2 或 1 的零填充仍然具有基于实际数据的乘法,一些值会在 "fake" 数据上求和(与填充零相乘的值)。在这种情况下,Matlab 为您提供了 3 个选项,供您选择如何编辑数据 return。首先,您可以获得 full
卷积,其中包括有偏差的值,因为它们包括添加实际上不在数据中的 0 值。或者你可以得到 same
,这意味着输出的长度是数据的长度 y = [4 3 8 1]
。这对应于 1 个零,但请注意,对于更长的内核,您可以在技术上获得 full
和 same
之间的其他长度,Matlab 不会 return 那些适合您的。
最后,也许最重要的是理解所有这些,你有 valid
选项。在您的示例中,只有 2 个输出样本是根据仅对实际数据进行乘法计算得出的总和(即,将内核样本与来自 x
而不是来自零的样本相乘)。更具体地说:
y[2] = h[2]*x[0] + h[1]*x[1] + h[2]*x[2] = 3 //0 based indexing like example
y[3] = h[2]*x[1] + h[1]*x[2] + h[2]*x[3] = 8
注意 none 的其他 y
值仅使用 h
和 x
计算,它们都包含一个填充零,这不一定表示真实数据。例如:
y[4] = h[2]*x[2] + h[1]*x[3] + h[2]*0 <= padded zero
Here是给定卷积的例子:
我这里有两个问题:
为什么向量两边各补两个0?因为,kernel的长度ℎ为3,如果两边各补一个0,则卷积输出的中间元素在的长度范围,为什么不是每边一个0呢?
向我解释以下输出:
>> x = [1, 2, 1, 3]; >> h = [2, 0, 1]; >> y = conv(x, h, 'valid') y = 3 8 >>
valid
在前面显示的向量数学 和 ℎ?[=16 的上下文中做什么=]
我不能说零填充的数量是正确的....话虽如此,任何零填充都是在弥补不存在的数据。这不一定是错误的,但您应该意识到计算此信息的值可能有偏差。有时你关心这个,有时你不关心。引入 1 个零(在这种情况下)会使中间内核值始终留在数据中,但为什么这应该是一个停止标准?重要的是,添加 2 个零仍然会留下数据和内核中实际存在的值的乘积(x[0]*h[0] 和 x[3]*h[2] - 使用基于 0 的索引)。添加第三个零(或更多)只会在输出中产生零,因为 3 是内核的长度。换句话说,对于从 n=1 到 n = length(h)-1(在本例中为 1 或 2)的任何零填充,零填充将始终产生部分基于实际数据(但不完全)的输出。
即使长度为 2 或 1 的零填充仍然具有基于实际数据的乘法,一些值会在 "fake" 数据上求和(与填充零相乘的值)。在这种情况下,Matlab 为您提供了 3 个选项,供您选择如何编辑数据 return。首先,您可以获得
full
卷积,其中包括有偏差的值,因为它们包括添加实际上不在数据中的 0 值。或者你可以得到same
,这意味着输出的长度是数据的长度y = [4 3 8 1]
。这对应于 1 个零,但请注意,对于更长的内核,您可以在技术上获得full
和same
之间的其他长度,Matlab 不会 return 那些适合您的。
最后,也许最重要的是理解所有这些,你有 valid
选项。在您的示例中,只有 2 个输出样本是根据仅对实际数据进行乘法计算得出的总和(即,将内核样本与来自 x
而不是来自零的样本相乘)。更具体地说:
y[2] = h[2]*x[0] + h[1]*x[1] + h[2]*x[2] = 3 //0 based indexing like example
y[3] = h[2]*x[1] + h[1]*x[2] + h[2]*x[3] = 8
注意 none 的其他 y
值仅使用 h
和 x
计算,它们都包含一个填充零,这不一定表示真实数据。例如:
y[4] = h[2]*x[2] + h[1]*x[3] + h[2]*0 <= padded zero