赞
踩
由于我发现网上并没有关于向量与矩阵两者进行卷积计算的具体算法,所以我就跟各位网友分享一下我的观点。因为本人知识储备有限,对卷积的了解也很是肤浅,没有深入研究,所以有错误的地方还请大神们指正,小子不胜感激。
声明一下,以下算法是经过实例验证的,所以从数据的值的层面上来说是正确的。
在进入正题之前,需要跟大家说明一下,本篇文章主要是针对matlab中conv2( , , ‘same’);这句的翻译,对于其它格式,尚未研究。至于什么是卷积,它的数学表达式,作用等等问题,维基百科和各大神的博客上都有,这里就不再赘述。
在matlab中,函数conv和conv2都是用来计算卷积的,因为这里是对二维矩阵进行卷积计算,并且结果也是一个二维矩阵,所以用conv2。对于连续函数的卷积计算是求积分,对离散型的,例如矩阵,求卷积时,是向量的各元素值与对应位置上的矩阵的值相乘之后求和,并用所求和生成一个新的矩阵。图解如下:
设现有 4*4 矩阵f = [1 2 3 4 ; 5 6 7 8 ; 9 10 11 12 ; 13 14 15 16],向量l = [2 3 1]
1、对于没有类型参数’same’的conv2,生成的矩阵行数与原矩阵相同,列数为向量列数和矩阵列数之和减一。具体算法:
(1)先将向量反褶,此处即反褶为[1 3 2];
(2)将反褶后的向量在矩阵上一行一行滑动,并将重叠部分的两个值相乘,将所有的乘积求和,然后产生一个新的值。对第一行的计算过程如下,其余行相同。
计算结果如下:
2、对于有类型‘same’的conv2,所得结果是一个与原矩阵相同大小的矩阵,所以相对于上面的算法,需要舍弃一部分结果,而保存结果的方式,跟图像腐蚀的原理类似。需要有一个核,这里的核就是向量里的某个元素,用他遍历矩阵,重叠部分算法和上面一样。具体步骤如下:
(1)将向量反褶
(2)确定核,设向量的长度为ksize,那么核的在向量中的角标就是ksize - (int)((ksize + 2) / 2)。
(3)用核遍历矩阵,相乘求和。
图解如下:
角标 = 3 – 2 = 1
结果如下:
以上便是我根据实际总结的算法,与matlab运行结果吻合,同理,列向量与矩阵的卷积算法相同。
小技巧:列向量与矩阵卷积:如果是用C语言写卷积函数,只需要写一个方向,即行向量与矩阵卷积即可,C语言中,向量的存储方式是线性的,所以行向量和列向量在内存上没区别,当列向量求卷积的时候,只需要将矩阵转置,让后按照行向量的求法求卷积,再把结果转置回来就行了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。