conv(多项式乘法)
在 MATLAB 中,conv
函数原本用于计算序列的卷积,但由于多项式乘法的数学本质与卷积运算完全一致,因此它被直接用于多项式乘法:两个多项式的系数向量的卷积,就是乘积多项式的系数向量。以下结合具体示例,从数学原理到计算过程详细解释:
一、多项式乘法的本质:合并同类项
多项式乘法的核心是:将两个多项式的每一项分别相乘,再合并同次幂项的系数。
以示例中的多项式为例:
- \(p_1(x) = x + 1\)(1 次多项式,最高次幂为 \(x^1\))
- \(p_2(x) = x + 2\)(1 次多项式,最高次幂为 \(x^1\))
它们的乘积为:\(p_1(x) \cdot p_2(x) = (x + 1)(x + 2) = x \cdot x + x \cdot 2 + 1 \cdot x + 1 \cdot 2\)合并同类项(同次幂的项相加):
- \(x^2\) 项:\(x \cdot x = x^2\)(系数为 \(1 \times 1 = 1\))
- \(x^1\) 项:\(x \cdot 2 + 1 \cdot x = 2x + x = 3x\)(系数为 \(1 \times 2 + 1 \times 1 = 3\))
- \(x^0\) 项(常数项):\(1 \cdot 2 = 2\)(系数为 \(1 \times 2 = 2\))
最终乘积多项式为:\(p(x) = x^2 + 3x + 2\),其系数向量(降幂排列)为 [1, 3, 2]
。
二、卷积运算的定义:序列的加权求和
对于两个序列(向量)\(a = [a_0, a_1, \dots, a_m]\) 和 \(b = [b_0, b_1, \dots, b_n]\),它们的卷积(full 卷积)结果是一个长度为 \(m + n + 1\) 的序列 c,其中第 k 个元素 \(c_k\) 的计算规则为:\(c_k = \sum_{i=0}^k a_i \cdot b_{k-i} \quad \text{(当 } i \text{ 超出序列长度时,对应元素视为0)}\)
三、卷积的计算步骤:“翻转→滑动→相乘→求和”
卷积的过程可拆解为 4 个核心步骤,用具体例子说明更直观。
示例:设序列 \(a = [1, 2, 3]\)(长度 \(m=3\)),\(b = [4, 5]\)(长度 \(n=2\)),计算 \(c = a * b\)。
步骤 1:翻转其中一个序列(通常翻转较短的序列)
卷积具有交换律(\(a * b = b * a\)),为方便计算,通常翻转较短的序列。这里翻转 b:原 \(b = [b_0, b_1] = [4, 5]\) → 翻转后 \(b_{\text{flip}} = [b_1, b_0] = [5, 4]\)。
步骤 2:滑动翻转后的序列,对齐元素
将翻转后的 \(b_{\text{flip}}\) 沿 a 滑动,从 “完全左偏” 到 “完全右偏”,每次滑动 1 个位置,直到所有元素对齐完毕。
滑动过程中,两个序列的 “重叠范围” 会逐渐变化,共需要滑动 \(m + n - 1 = 3 + 2 - 1 = 4\) 次(对应卷积结果的 4 个元素)。
步骤 3:每个位置计算 “相乘求和”
对每个滑动位置,计算两序列重叠元素的乘积之和,结果即为卷积序列 c 的对应元素。
详细滑动计算过程:
-
第 1 个位置(\(k=0\)):
- 翻转后的 \(b_{\text{flip}}\) 左偏,仅 \(b_1\) 与 \(a_0\) 对齐:重叠元素:\(a_0 = 1\),\(b_1 = 4\)(其他位置视为 0)
- 求和:\(c_0 = a_0 \cdot b_1 = 1 \times 4 = 4\)
-
第 2 个位置(\(k=1\)):
- 向右滑动 1 位,\(b_{\text{flip}}\) 的 \(b_1\) 对齐 \(a_1\),\(b_0\) 对齐 \(a_0\):重叠元素:\(a_0 = 1\) 与 \(b_0 = 5\),\(a_1 = 2\) 与 \(b_1 = 4\)
- 求和:\(c_1 = a_0 \cdot b_0 + a_1 \cdot b_1 = 1 \times 5 + 2 \times 4 = 5 + 8 = 13\)
-
第 3 个位置(\(k=2\)):
- 再向右滑动 1 位,\(b_{\text{flip}}\) 的 \(b_1\) 对齐 \(a_2\),\(b_0\) 对齐 \(a_1\):重叠元素:\(a_1 = 2\) 与 \(b_0 = 5\),\(a_2 = 3\) 与 \(b_1 = 4\)
- 求和:\(c_2 = a_1 \cdot b_0 + a_2 \cdot b_1 = 2 \times 5 + 3 \times 4 = 10 + 12 = 22\)
-
第 4 个位置(\(k=3\)):
- 最后滑动 1 位,仅 \(b_0\) 与 \(a_2\) 对齐:重叠元素:\(a_2 = 3\) 与 \(b_0 = 5\)(其他位置视为 0)
- 求和:\(c_3 = a_2 \cdot b_0 = 3 \times 5 = 15\)
结果
卷积序列 \(c = [4, 13, 22, 15]\),即 \(a * b = [4, 13, 22, 15]\)。
四、MATLAB 中conv
函数的验证
用conv
函数直接计算上述例子,结果一致:
a = [1, 2, 3];
b = [4, 5];
c = conv(a, b); % 计算卷积
disp(c); % 输出:4 13 22 15
五、卷积的物理意义:“加权滑动平均”
卷积的本质是一个序列对另一个序列的 “加权滤波”:
- 若将 a 视为 “输入信号”,b 视为 “滤波器的冲激响应”,则卷积 \(c = a * b\) 就是 “滤波后的输出信号”;
- 翻转序列 b 相当于 “时间反转”,滑动过程相当于 “信号在时间上的延迟”,相乘求和相当于 “对不同延迟的信号加权累加”。
例如:在图像处理中,用一个高斯核(序列 b)与图像像素(序列 a)卷积,可实现模糊效果(本质是对像素的加权平均)。
总结
卷积的核心是 “翻转→滑动→相乘→求和”,conv
函数通过实现这一过程,计算两个离散序列的卷积。它不仅是多项式乘法的基础,更是信号处理、图像处理中 “加权滤波”“特征提取” 的核心工具,其本质是对序列的 “动态加权累加”。