conv2卷积计算整理

关于conv2函数的计算过程

假设有两个矩阵a,b,a的大小是ma行na列,b的大小是mb行nb列。

c=conv2(a,b)计算这两个矩阵的卷积,c的大小是ma+mb-1行,na+nb-1列。

计算过程如下:

1.对矩阵a进行边界填补0,填充规则是:在a的第一行之前和最后一行之后分别填充mb-1行0,并在a的第一列之前和最后一列之后分别填充nb-1列0;

2.对矩阵b进行翻转,上下换位左右换位。%rot90(b,2)或者fliplr(flipud(b))或者flipud(fliplr(b))

3.从左上角开始,按照先列后行的顺序在矩阵a上滑动矩阵b,对应的元素相乘然后求和所得的数值为相应的c中的值。

例子如下:

NOTE:关于shape选项的说明;

shape=full,     返回全部二积结果,即返回c的大小ma+mb-1xna+nb-1
    shape=same
,返回与a大小的卷中心部分,若涉及奇偶区分时,像高位取,如行数为3,中心在第二行,取两行则取第二第三行,列数为6,中心在第三列,要取四列,则取二三四五列。
    shape=valid
,   不考虑边零,即只要有出的零参与运算的都舍去,返回c的大小ma-mb+1xna-nb+1



这里给出一种最原始的实现方案。这种实现对于数据矩阵大小为1000x1000,卷积核矩阵大小为20x20,在我的机器上需要大约1秒钟的时间,而matlab采用的MKL库最快只需要将近0.1s的时间。下面的代码用到了自己目前开发的FastIV中的一些函数接口。具体代码如下:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "fiv_core.h"  
  2.   
  3. typedef enum{  
  4.     FIV_CONV2_SHAPE_FULL,  
  5.     FIV_CONV2_SHAPE_SAME,  
  6.     FIV_CONV2_SHAPE_VALID  
  7. }FIV_CONV_SHAPE;  
  8.   
  9.   
  10. void fIv_conv2(fIvMat** dst_
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值