前两天参加笔试时候有个题考的是二维卷积,发现不会做了,这里做一下方法总结:
二维卷积公式:
离散二维卷积公式:
在网上找到一种比较好理解的多项式乘法方法计算矩阵卷积方法(来源:http://bbs.sciencenet.cn/home.php?mod=space&uid=268138&do=blog&id=383185):
a和d的卷积就是,把a和d的第一行作为一个多项式的系数,按多项式升幂排列(也可以按降幂),即为:
所得卷积矩阵为:
经过matlab函数conv2的验证,这种方法结果是正确的。
这里给出的矩阵大小是相同的,如果大小不相同又怎么办呢?比如说:
c=[1 2;3 4;5 6],d=[7 8;1 2];c*d=?
按多项式相乘方法算了下(因为是2x3矩阵卷积2x2矩阵,卷积后矩阵大小应为(2+2-1)x(2+3-1)=3x4),这里只写出多项式系数:
(1 2)(7 8)=(7 22 16);
(1 2)(1 2)+(3 4)(7 8)=(21 52 32)+(1 4 4)=(22 56 36);
(5 6)(7 8)+(3 4)(1 2)=(3 10 8)+(35 82 48)=(38 92 56);
(5 6)(1 2)=(5 16 12);
matlab的运算结果为[7 22 16;22 56 36;38 92 56;5 16 12],一致。
方法清楚了,但是感觉还是有点乱,规律是什么呢?仔细看下,发现规律如下:
将前面一个矩阵翻转180°,然后像一般卷积那样移位相乘相加,只不过方向变成了由上往下。比如,第一个例子中a翻转后(8 1 6)在最下面,当由上往下移动时,先与b的第一行(2 3 2)重叠,于是做二项式相乘得到结果的第1行;然后继续a继续向下移动,(8 1 6)与b的第2行重叠,(3 5 7)与b的第二行重叠,于是这两项分别进行相乘,然后相加得到结果的第二行...以此类推,最后得出结果。
(转自http://hi.baidu.com/foolwish/item/92f40e4456d38f3a10ee1e9f)