C语言用子函数实现卷积

Python036

C语言用子函数实现卷积,第1张

conv(int u[],int v[],int w[], int m, int n)

{

   int i, j

       

   int k = m+n-1

   for(i=0 i<k i++)

      for(j=max(0,i+1-n) j<=min(i,m-1) j++)

      {   

       w[i] += u[j]*v[i-j]

      } 

}

u[],v[]为原始数组,m,n分别为数组长度,w[]为卷积结果(w[]需初始化为0),其长度为m+n-1

conv是卷积运算,同时也可以做多项式的乘法C=conv2(A,B) C=conv2(Hcol,Hrow,A) C=conv2(,'shape') 说明:对于 C=conv2(A,B) ,conv2 的算矩阵 A 和 B 的卷积,若 [Ma,Na]=size(A), [Mb,Nb]=size(B), 则 size(C)=[Ma+Mb-1,Na+Nb-1]C=conv2(Hcol,Hrow,A) 中,矩阵 A 分别与 Hcol 向量在列方向和 Hrow 向量在行方向上进行卷积C=conv2(,'shape') 用来指定 conv2 返回二维卷积结果部分,参数 shape 可取值如下: 》full 为缺省值,返回二维卷积的全部结果》same 返回二维卷积结果中与 A 大小相同的中间部分valid 返回在卷积过程中,未使用边缘补 0 部分进行计算的卷积结果部分,当 size(A)>size(B) 时,size(C)=[Ma-Mb+1,Na-Nb+1]。应用举例:A = magic(5) A = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 B = [1 2 10 2 03 1 3] B = 1 2 1 0 2 0 3 1 3 C = conv2(A,B) C = 17 58 66 34 32 38 15 23 85 88 35 67 76 16 55 149 117 163 159 135 67 79 78 160 161 187 129 51 23 82 153 199 205 108 75 30 68 135 168 91 84 9 33 65 126 85 104 15 27 可以自己 help conv至于gggfconv和 ggfconv,matlab 不自带这两个函数,你看到的应该是别人自己写的,用户自定义。

这个是例子是典型的函数递归调用。

要理解递归调用,需要了解两件事:

1。函数多层嵌套调用。函数调用前,系统会保存程序指针位置(也叫函数返回地址,保存在堆栈中),以便函数执行完后,回来后能继续执行原来的程序。

如果被调用的子函数又调用孙函数,也同样,于是在堆栈里就一层层的放了很多函数返回地址。

在辈份最小的函数执行完后,程序指针又一级级的往回返回。

这样的过程,就是函数多层嵌套调用。

如果每层调用的都是同一个函数,就叫递归调用,递归调用只是多层嵌套调用的一个特例。

2。动态变量。在C语言中,动态变量是保存在堆栈中的(还有函数返回值,也是在堆栈中分配),这些变量会接着前面的那个“函数返回地址”进行分配,函数执行完成后,堆栈指针会直接调到函数返回地址,这些动态的东西就都释放了。

在进入函数时,就会在堆栈中创建这些动态变量,多层嵌套也不例外,递归也不例外,每层都创建自己的动态变量。

对于本例,每次调用,类似于子函数,也同时就有子变量b,孙变量b。。。

这样,按照父传子,子传孙的顺序(这里没有用指针,所以是值传递),就可以依次写出函数执行结果了。第一次调用时,b=22,b%2=0,第二次时,b子=11,后面依次,b孙=5,b重孙=2,b曾孙=1。

因为程序中先调用了子函数,后打印,所以,曾孙最先打印出来,然后返回,依次打印重孙,孙,子,父。

这个有点像国家给农民发粮补:中央(main)拨22元到省里,由于各种原因,到县里是11元,乡里5元,村里2元,到农民手里变成了1元。农民入帐(打印)后签收条(无异议)报国家,村里拿到这个才安心做帐(打印),再到乡里,县里,省里,每级做同样的事。。。

结果如下:10110