矩阵卷积的快速算法

悲剧的面试

上周二去面试一家公司,好几个问题上都卡住了。

原先刷的都是算法、数据结构上的问题。简历上写的课程上的知识几乎全忘了(本身也没兴趣),结果面试官按着简历上的课程问,悲剧了。

题目

一个M×N的矩阵A,以及一个K×K的矩阵B,对两个矩阵做卷积运算,复杂度为多少?有没有快速运算?

思路

如果考虑暴力法,那复杂度显然是O(MNK2)

快速算法当时一直在往动态规划上套,死活想不出来,%>_<%

回来仔细想了想,这不是能用变换域做嘛%>_<%

这个和编程倒是没什么关系,是用在信号处理和图像处理上的。

卷积运算在频域会变成乘法运算,复杂度大降。

数学原理

假设矩阵a为M×N的矩阵,b为K×K的矩阵,那么它们的卷积为

s(m,n)=ab=i=0K1j=0K1a(mi,nj)b(i,j)

很容易看出来,复杂度是O(MNK2)

如果对s做二维DFT(M+k-1与N+k-1点),有

S(u,v)=m=0M+K2n=0N+K2s(m,n)ej2πmuM+K1e2πnvN+K1=m=0M+K2n=0N+K2s(m,n)ej2π(mi)uM+K1ej2π(nj)vN+K1ej2πiuM+K1ej2πjuN+K1=m=0M+K2n=0N+K2i=0K1j=0K1a(mi,nj)b(i,j)ej2π(mi)uM+K1ej2π(nj)vN+K1ej2πiuM+K1ej2πjuN+K1=i=0K1j=0K1b(i,j)m=0M+K2n=0N+K2a(mi,nj)ej2π(mi)uM+K1ej2π(nj)vN+K1ej2πiuM+K1ej2πjuN+K1=i=0K1j=0K1b(i,j)ej2πiuM+K1ej2πjuN+K1A(u,v)=B(u,v)A(u,v)

当然如果使用普通的DFT,变换与反变换过程的复杂度是O(M2N2),相乘的复杂度是O(MN),总体的复杂度是O(M2N2)

比普通的卷积效果还差。

这时候就要祭出大杀器FFT了,变换域反变换过程的复杂度降低到了O(MNlogMlogN),总体的复杂度为O(MNlogMlogN)

那么如果K2>logMlogN,这样的计算就能够带来性能上的提高。


版权声明:本文为wujianhenhao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。