706 words4 min
数学:卷积
卷积(Convolution)是通过两个函数 f 和 g 生成第三个函数的一种数学算子。
卷积(Convolution)记作 f∗g。
对于实变量函数 f 和 g:
(f∗g)(t)=∫−∞+∞f(τ)g(t−τ)dτ
对于数列 {fn} 和 {gn}:
(f∗g)n=k=−∞∑+∞fkgn−k
若 {fn} 仅在 [0,m] 上非零、{gn} 仅在 [0,n] 上非零,则结果仅在 [0,m+n] 上非零:
(f∗g)i=k=0∑ifkgi−k
「卷积」一词来自「卷起 + 积分」这一动作:
- 把 g 沿 y 轴翻转,得到 g(−τ);
- 平移 t 个单位,得到 g(t−τ);
- 与 f(τ) 逐点相乘;
- 对 τ 求积分(离散时为求和)。
随着 t 变化,g(t−τ) 沿 τ 轴滑动,与 f(τ) 的重叠区域随之改变,积分值即为 (f∗g)(t)。
「卷」描述翻转滑动,「积」描述逐点相乘后再求和。两个动作合起来正是「卷积」。
把数列 {fn} 和 {gn} 视为多项式的系数:
F(x)=k=0∑mfkxk,G(x)=k=0∑ngkxk
它们的乘积 H(x)=F(x)G(x) 是一个 m+n 次多项式,xi 的系数为:
hi=k=0∑ifkgi−k
这正是 {fn} 与 {gn} 的离散卷积。
多项式相乘,就是系数做卷积。
对函数(或数列)f,g,h 与标量 c:
- 交换律:f∗g=g∗f;
- 结合律:(f∗g)∗h=f∗(g∗h);
- 分配律:f∗(g+h)=f∗g+f∗h;
- 数乘:(cf)∗g=c(f∗g)。
证明从定义直接展开即可。
特别地,单位元 是 狄拉克 δ 函数(连续)或 克罗内克 δ 函数(离散):
f∗δ=f
按定义直接计算长度分别为 m 和 n 的数列的卷积,时间复杂度为 O(mn)。
利用 快速傅里叶变换(Fast Fourier Transform,FFT)可以降至 O((m+n)log(m+n)),是处理大规模多项式乘法的标准做法。
求 {an}={1,2,3} 与 {bn}={4,5,6} 的卷积 {cn}。
按定义:
c0c1c2c3c4=a0b0=1⋅4=4=a0b1+a1b0=1⋅5+2⋅4=13=a0b2+a1b1+a2b0=1⋅6+2⋅5+3⋅4=28=a1b2+a2b1=2⋅6+3⋅5=27=a2b2=3⋅6=18
即 {cn}={4,13,28,27,18}。
也可用多项式乘法验证:
(1+2x+3x2)(4+5x+6x2)=4+13x+28x2+27x3+18x4
系数与卷积结果一致。
将「加法」换为其他运算、或将定义域换为其他结构,可以得到一系列推广:
- 范德蒙德卷积:组合恒等式 k∑(km)(r−kn)=(rm+n);
- 狄利克雷卷积:数论中按因子求和的卷积 (f∗g)(n)=d∣n∑f(d)g(dn);
- 位运算卷积 与 子集卷积:将下标的加法替换为 or、and、xor 等位运算,详见 《题解:洛谷 P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)》。