Skip to main content
706 words4 min

数学:卷积

卷积(Convolution)是通过两个函数 ffgg 生成第三个函数的一种数学算子。

参考资料

定义

卷积(Convolution)记作 fgf*g

连续卷积

对于实变量函数 ffgg

(fg)(t)=+f(τ)g(tτ)dτ(f*g)(t)=\int_{-\infty}^{+\infty}f(\tau)g(t-\tau)\mathrm{d}\tau

离散卷积

对于数列 {fn}\set{f_n}{gn}\set{g_n}

(fg)n=k=+fkgnk(f*g)_n=\sum_{k=-\infty}^{+\infty}f_k g_{n-k}

{fn}\set{f_n} 仅在 [0,m][0,m] 上非零、{gn}\set{g_n} 仅在 [0,n][0,n] 上非零,则结果仅在 [0,m+n][0,m+n] 上非零:

(fg)i=k=0ifkgik(f*g)_i=\sum_{k=0}^{i}f_k g_{i-k}

直观

「卷积」一词来自「起 + 分」这一动作:

  1. gg 沿 yy 轴翻转,得到 g(τ)g(-\tau)
  2. 平移 tt 个单位,得到 g(tτ)g(t-\tau)
  3. f(τ)f(\tau) 逐点相乘;
  4. τ\tau 求积分(离散时为求和)。

随着 tt 变化,g(tτ)g(t-\tau) 沿 τ\tau 轴滑动,与 f(τ)f(\tau) 的重叠区域随之改变,积分值即为 (fg)(t)(f*g)(t)

tip

「卷」描述翻转滑动,「积」描述逐点相乘后再求和。两个动作合起来正是「卷积」。

多项式乘法

把数列 {fn}\set{f_n}{gn}\set{g_n} 视为多项式的系数:

F(x)=k=0mfkxk,G(x)=k=0ngkxkF(x)=\sum_{k=0}^{m}f_k x^k,\quad G(x)=\sum_{k=0}^{n}g_k x^k

它们的乘积 H(x)=F(x)G(x)H(x)=F(x)G(x) 是一个 m+nm+n 次多项式,xix^i 的系数为:

hi=k=0ifkgikh_i=\sum_{k=0}^{i}f_k g_{i-k}

这正是 {fn}\set{f_n}{gn}\set{g_n} 的离散卷积。

多项式相乘,就是系数做卷积。

性质

对函数(或数列)f,g,hf,g,h 与标量 cc

  • 交换律fg=gff*g=g*f
  • 结合律(fg)h=f(gh)(f*g)*h=f*(g*h)
  • 分配律f(g+h)=fg+fhf*(g+h)=f*g+f*h
  • 数乘(cf)g=c(fg)(cf)*g=c(f*g)

证明从定义直接展开即可。

特别地,单位元狄拉克 δ 函数(连续)或 克罗内克 δ 函数(离散):

fδ=ff*\delta=f

计算复杂度

按定义直接计算长度分别为 mmnn 的数列的卷积,时间复杂度为 O(mn)O(mn)

利用 快速傅里叶变换(Fast Fourier Transform,FFT)可以降至 O((m+n)log(m+n))O((m+n)\log(m+n)),是处理大规模多项式乘法的标准做法。

例题

{an}={1,2,3}\set{a_n}=\set{1,2,3}{bn}={4,5,6}\set{b_n}=\set{4,5,6} 的卷积 {cn}\set{c_n}

按定义:

c0=a0b0=14=4c1=a0b1+a1b0=15+24=13c2=a0b2+a1b1+a2b0=16+25+34=28c3=a1b2+a2b1=26+35=27c4=a2b2=36=18\begin{aligned} c_0 &= a_0 b_0=1\cdot 4=4 \\ c_1 &= a_0 b_1+a_1 b_0=1\cdot 5+2\cdot 4=13 \\ c_2 &= a_0 b_2+a_1 b_1+a_2 b_0=1\cdot 6+2\cdot 5+3\cdot 4=28 \\ c_3 &= a_1 b_2+a_2 b_1=2\cdot 6+3\cdot 5=27 \\ c_4 &= a_2 b_2=3\cdot 6=18 \end{aligned}

{cn}={4,13,28,27,18}\set{c_n}=\set{4,13,28,27,18}

也可用多项式乘法验证:

(1+2x+3x2)(4+5x+6x2)=4+13x+28x2+27x3+18x4(1+2x+3x^2)(4+5x+6x^2)=4+13x+28x^2+27x^3+18x^4

系数与卷积结果一致。

推广

将「加法」换为其他运算、或将定义域换为其他结构,可以得到一系列推广:

  • 范德蒙德卷积:组合恒等式 k(mk)(nrk)=(m+nr)\displaystyle\sum_{k}\binom{m}{k}\binom{n}{r-k}=\binom{m+n}{r}
  • 狄利克雷卷积:数论中按因子求和的卷积 (fg)(n)=dnf(d)g ⁣(nd)\displaystyle(f*g)(n)=\sum_{d\mid n}f(d)g\!\left(\frac{n}{d}\right)
  • 位运算卷积子集卷积:将下标的加法替换为 or\operatorname{or}and\operatorname{and}xor\operatorname{xor} 等位运算,详见 《题解:洛谷 P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)》