卷积及其应用
向量计算
给定向量:
-
a=(a0,a1,...,an−1)
-
b=(b0,b1,...,an−1)
向量和: a+b=(a0+b0,a1+b1,...,an−1+bn−1
内积: a⋅b=a0b0+a1b1+...+an−1bn−1
卷积: a∗b=(c0,c1,...,c2n−2),其中ck=i,j<ni+j=k∑aibj,k=0,1,2,...,2n−2
卷积的意义:在下述矩阵中,每个斜线的项之和恰好是卷积中的各个分量。
a0ba1b⋮an−2ban−1bab0a0b0a1b0⋮an−2b0an−1b0ab1a0b1a1b1⋮an−2b1an−1b1...............abn−2a0bn−2a1bn−2⋮an−2bn−2an−1bn−2abn−1a0bn−1a1bn−1⋮an−2bn−1an−1bn−1
计算实例:
向量:a=(1,2,4,3),b=(4,2,8,0),
则:
-
a+b=(5,3,12,3)
-
a⋅b=1×4+2×2+4×8+3×0=40
-
a∗b=(4,10,28,36,38,24,0)
其中,28是这么计算出来的:
a0ba1ba2ba3bab01×42×44×43×4ab11×22×24×23×2ab21×82×84×83×8ab31×02×04×03×0
卷积与多项式乘法的关系
多项式乘法:C(x)=A(x)B(x)
A(x)=a0+a1x+a2x2+⋯+am−1xm−1
B(x)=b0+b1x+b2x2+⋯+bn−1xn−1
C(x)=a0b0+(a0b1+a1b0)x+⋯+am−1bn−1xm+n−2
其中xk的系数
ck=i∈{0,1,,...,m−1},j∈{0,1,...,n−1}i+j=k∑aibj,k=0,1,…,m+n−2
平滑处理
信号向量:a=(a0,a1,…,am−1)
b=(b2k,b2k−1,...,b0)=(w−k,...,wk)
ai′=∑s=−kkai+sbk−s=∑s=−kkai+sws
把向量b看作2k+1长度窗口在a上移动计算a∗b,得到(a0′,a1′,...,am−1′)。有少数向有误差。
实例:
信号向量:a=(a0,a1,...,a8)
步长:k=2
权值:w=(w−2,w−1,w0,w1,w2)=(b4,b3,b2,b2,b1,b0)
ai′=ai−2b4+ai−1b3+aib2+ai+1b1+ai+2b0
下标之和为i+k
卷积计算
蛮力算法
向量a=(a0,a1,....,an−1)和b=(b0,b1,...,bn−1)
A(x)=a0+a1x+a2x2+...+an−1xn−1
B(x)=b0+b1x+b2x2+...+bn−1xn−1
C(x)=A(x)B(x)=a0b0+(a0b1+a1b0)x+...+an−1bn−1x2n−2
C(x)的系数向量就是a∗b,即卷积a∗b计算等价于多项式相乘。
蛮力算法时间为O(n2)
计算2n-1次多项式C(x):
-
选择值x0,x1,...,x2n−1,求出A(xj)和B(xj),j=0,1,...,2n−1
-
对每个j,计算C(xj)=A(xj)B(xj)
-
利用多项式插值的方法,由C(x)在x=x0,x1,...,x2n−1的值求出多项式C(x)的系数
主要步骤是多项式求值。如何选择x0,x1,x2,...的值就是高效求取多项式关键问题。
高斯滤波的权值函数为:
ws=z1e−s2,s=0,±1,...,±k
w=(w−k,...,w−1,w0,w1,...,wk)
其中z用于归一化处理,使所有的权值之和为1,处理结果:
ai′=s=−k∑kai+sws
2n个数的选择:1的2n次根
ωj=e2n2πji=enπjicosnπj+isinnπj
j=0,1,...,2n−1,i=−1
当n=4时,
-
ω0=1,ω1=e4πi=2/2+2/2⋅i
-
ω2=e2πi=i,ω3=e43πi=−2/2+2/2⋅i
-
ω4=eπi=−1,ω5=e45πi=−2/2−2/2⋅i
-
ω6=e23πi=−i,ω7=e47πi=2/2−2/2⋅i
快速傅里叶变换FFT算法
设计思想
-
对x=1,ω1,ω2,...,ω2n−1,分别计算A(x),B(x);
-
利用第1步中的结果堆每个x=1,ω1,ω2,...,ω2n−1,计算得到C(x),得到C(1)=d0,C(ω1)=d1,...,C(ω2n−1=d2n−1;
-
构造多项式:D(x)=d0+dix+d2x2+...+d2n−1x2n−1。
-
对x=1,ω1,ω2,...,ω2n−1,计算D(x),D(1),D(ω1),...,D(ω2n−1)
可以证明:
D(1)=2nc0D(ω1)=2nc2n−1...D(ω2n−1)=2nc1⇔c0=D(1)/2nc2n−1=D(ω1)/2n...c1=D(ω2n−1)/2n
算法的关键:
令x=1,ω1,ω2,...,ω2n−1,
-
步1对2n个x值分别求多项式A(x),B(x)
-
步2做2n次乘法
-
步3对2n个x值求值多项式D(x)
关键:一个对所有的x快速多项式求值算法。
多项式求值算法
给定多项式:
A(x)=a0+a1x+...+an−1xn−1
设x为1的2n次根,对所有的x计算A(x)的值。
算法1:对每个x做下述运算:
依次计算每个项aixi,i=1,...,n−1对aixi(i=0,1,...,n−1)求和。
蛮力算法的时间复杂度:T1(n)=O(n3)
改进的算法2:对每个x做下述运算:
A1(x)=an−1
A2(x)=an−2+xA1(x)=an−2+an−1x
A3(x)=an−3+xA2(x)=an−3+an−2x+an−1x2
...
An(x)=a0+xAn−1(x)=A(x)
带入已经计算的值,得到新的算法。
算法的时间复杂度:T2(n)=O(n2)
平面点集的凸包
问题(平面点集的凸包)
给定大量离散点的集合Q,求一个最小的凸多边形,使得Q中的点在该多边形内或者边上。
应用背景:
图形处理中用于形状识别:字形识别、碰撞检测等。
分治算法
-
以连接点最大纵坐标点ymax和最小纵坐标点ymin的线段d={ymax,ymin}划分L为左点集Lleft和右点集L_{right}$。
-
Deal(Lleft=Deal(Lright)
Deal(L_left)
考虑Lleft:确定距d最远的点P
在三角形内的点,删除: