annotate main/image/conv2.cc @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children 276d676c91da
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
1 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
2 * conv2: 2D convolution for octave
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
3 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
4 * Copyright (C) 1999 Andy Adler
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
5 * This code has no warrany whatsoever.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
6 * Do what you like with this code as long as you
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
7 * leave this copyright in place.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
8 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
9 * $Id$
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
10
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
11 ## 2000-05-17: Paul Kienzle
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
12 ## * change argument to vector conversion to work for 2.1 series octave
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
13 ## as well as 2.0 series
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
14 ## 2001-02-05: Paul Kienzle
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
15 ## * accept complex arguments
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
16
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
17 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
18
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
19 #include <octave/oct.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
20
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
21 #define MAX(a,b) ((a) > (b) ? (a) : (b))
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
22
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
23 #define SHAPE_FULL 1
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
24 #define SHAPE_SAME 2
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
25 #define SHAPE_VALID 3
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
26
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
27 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
28 extern MArray2<double>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
29 conv2 (MArray<double>&, MArray<double>&, MArray2<double>&, int);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
30
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
31 extern MArray2<Complex>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
32 conv2 (MArray<Complex>&, MArray<Complex>&, MArray2<Complex>&, int);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
33 #endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
34
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
35 template <class T>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
36 MArray2<T>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
37 conv2 (MArray<T>& R, MArray<T>& C, MArray2<T>& A, int ishape)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
38 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
39 int Rn= R.length();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
40 int Cm= C.length();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
41 int Am = A.rows();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
42 int An = A.columns();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
43
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
44 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
45 * Here we calculate the size of the output matrix,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
46 * in order to stay Matlab compatible, it is based
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
47 * on the third parameter if its separable, and the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
48 * first if it's not
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
49 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
50 int outM, outN, edgM, edgN;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
51 if ( ishape == SHAPE_FULL ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
52 outM= Am + Cm - 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
53 outN= An + Rn - 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
54 edgM= Cm - 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
55 edgN= Rn - 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
56 } else if ( ishape == SHAPE_SAME ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
57 outM= Am;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
58 outN= An;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
59 // Matlab seems to arbitrarily choose this convention for
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
60 // 'same' with even length R, C
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
61 edgM= ( Cm - 1) /2;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
62 edgN= ( Rn - 1) /2;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
63 } else if ( ishape == SHAPE_VALID ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
64 outM= Am - Cm + 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
65 outN= An - Rn + 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
66 edgM= edgN= 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
67 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
68
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
69 // printf("A(%d,%d) C(%d) R(%d) O(%d,%d) E(%d,%d)\n",
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
70 // Am,An, Cm,Rn, outM, outN, edgM, edgN);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
71 MArray2<T> O(outM,outN);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
72 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
73 * T accumulated the 1-D conv for each row, before calculating
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
74 * the convolution in the other direction
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
75 * There is no efficiency advantage to doing it in either direction
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
76 * first
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
77 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
78
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
79 MArray<T> X( An );
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
80
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
81 for( int oi=0; oi < outM; oi++ ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
82 for( int oj=0; oj < An; oj++ ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
83 T sum=0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
84
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
85 int ci= Cm - 1 - MAX(0, edgM-oi);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
86 int ai= MAX(0, oi-edgM) ;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
87 const T* Ad= A.data() + ai + Am*oj;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
88 const T* Cd= C.data() + ci;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
89 for( ; ci >= 0 && ai < Am;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
90 ci--, Cd--, ai++, Ad++) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
91 sum+= (*Ad) * (*Cd);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
92 } // for( int ci=
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
93
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
94 X(oj)= sum;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
95 } // for( int oj=0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
96
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
97 for( int oj=0; oj < outN; oj++ ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
98 T sum=0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
99
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
100 int rj= Rn - 1 - MAX(0, edgN-oj);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
101 int aj= MAX(0, oj-edgN) ;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
102 const T* Xd= X.data() + aj;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
103 const T* Rd= R.data() + rj;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
104
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
105 for( ; rj >= 0 && aj < An;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
106 rj--, Rd--, aj++, Xd++) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
107 sum+= (*Xd) * (*Rd);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
108 } //for( int rj=
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
109
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
110 O(oi,oj)= sum;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
111 } // for( int oj=0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
112 } // for( int oi=0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
113
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
114 return O;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
115 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
116
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
117 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
118 extern MArray2<double>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
119 conv2 (MArray2<double>&, MArray2<double>&, int);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
120
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
121 extern MArray2<Complex>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
122 conv2 (MArray2<Complex>&, MArray2<Complex>&, int);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
123 #endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
124
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
125 template <class T>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
126 MArray2<T>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
127 conv2 (MArray2<T>&A, MArray2<T>&B, int ishape)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
128 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
129 /* Convolution works fastest if we choose the A matrix to be
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
130 * the largest.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
131 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
132 * Here we calculate the size of the output matrix,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
133 * in order to stay Matlab compatible, it is based
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
134 * on the third parameter if its separable, and the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
135 * first if it's not
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
136 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
137 * NOTE in order to be Matlab compatible, we give
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
138 * wrong sizes for 'valid' if the smallest matrix is first
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
139 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
140
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
141 int Am = A.rows();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
142 int An = A.columns();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
143 int Bm = B.rows();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
144 int Bn = B.columns();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
145
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
146 int outM, outN, edgM, edgN;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
147 if ( ishape == SHAPE_FULL ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
148 outM= Am + Bm - 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
149 outN= An + Bn - 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
150 edgM= Bm - 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
151 edgN= Bn - 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
152 } else if ( ishape == SHAPE_SAME ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
153 outM= Am;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
154 outN= An;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
155 // Matlab seems to arbitrarily choose this convention for
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
156 // 'same' with even length R, C
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
157 edgM= ( Bm - 1) /2;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
158 edgN= ( Bn - 1) /2;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
159 } else if ( ishape == SHAPE_VALID ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
160 outM= Am - Bm + 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
161 outN= An - Bn + 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
162 edgM= edgN= 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
163 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
164
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
165 // printf("A(%d,%d) B(%d,%d) O(%d,%d) E(%d,%d)\n",
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
166 // Am,An, Bm,Bn, outM, outN, edgM, edgN);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
167 MArray2<T> O(outM,outN);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
168
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
169 for( int oi=0; oi < outM; oi++ ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
170 for( int oj=0; oj < outN; oj++ ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
171 T sum=0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
172
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
173 for( int bj= Bn - 1 - MAX(0, edgN-oj),
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
174 aj= MAX(0, oj-edgN);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
175 bj >= 0 && aj < An;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
176 bj--, aj++) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
177 int bi= Bm - 1 - MAX(0, edgM-oi);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
178 int ai= MAX(0, oi-edgM);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
179 const T* Ad= A.data() + ai + Am*aj;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
180 const T* Bd= B.data() + bi + Bm*bj;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
181
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
182 for( ; bi >= 0 && ai < Am;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
183 bi--, Bd--, ai++, Ad++) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
184 sum+= (*Ad) * (*Bd);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
185 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
186 * It seems to be about 2.5 times faster to use pointers than
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
187 * to do this
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
188 * sum+= A(ai,aj) * B(bi,bj);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
189 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
190 } // for( int bi=
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
191 } //for( int bj=
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
192
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
193 O(oi,oj)= sum;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
194 } // for( int oj=
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
195 } // for( int oi=
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
196 return O;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
197 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
198
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
199 DEFUN_DLD (conv2, args, ,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
200 "[...] = conv2 (...)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
201 CONV2: do 2 dimensional convolution
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
202
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
203 c= conv2(a,b) -> same as c= conv2(a,b,'full')
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
204
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
205 c= conv2(a,b,shape) returns 2-D convolution of a and b
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
206 where the size of c is given by
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
207 shape= 'full' -> returns full 2-D convolution
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
208 shape= 'same' -> same size as a. 'central' part of convolution
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
209 shape= 'valid' -> only parts which do not include zero-padded edges
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
210
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
211 c= conv2(a,b,shape) returns 2-D convolution of a and b
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
212
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
213 c= conv2(v1,v2,a) -> same as c= conv2(v1,v2,a,'full')
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
214
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
215 c= conv2(v1,v2,a,shape) returns convolution of a by vector v1
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
216 in the column direction and vector v2 in the row direction ")
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
217 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
218 octave_value_list retval;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
219 octave_value tmp;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
220 int nargin = args.length ();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
221 string shape= "full";
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
222 bool separable= false;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
223 int ishape;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
224
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
225 if (nargin < 2 ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
226 print_usage ("conv2");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
227 return retval;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
228 } else if (nargin == 3) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
229 if ( args(2).is_string() )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
230 shape= args(2).string_value();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
231 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
232 separable= true;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
233 } else if (nargin >= 4) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
234 separable= true;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
235 shape= args(3).string_value();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
236 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
237 if ( shape == "full" ) ishape = SHAPE_FULL;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
238 else if ( shape == "same" ) ishape = SHAPE_SAME;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
239 else if ( shape == "valid" ) ishape = SHAPE_VALID;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
240 else { // if ( shape
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
241 error("Shape type not valid");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
242 print_usage ("conv2");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
243 return retval;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
244 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
245
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
246 if (separable) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
247 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
248 * Check that the first two parameters are vectors
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
249 * if we're doing separable
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
250 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
251 if ( !( 1== args(0).rows() || 1== args(0).columns() ) ||
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
252 !( 1== args(1).rows() || 1== args(1).columns() ) ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
253 print_usage ("conv2");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
254 return retval;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
255 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
256
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
257 if (args(0).is_complex_type() || args(1).is_complex_type()
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
258 || args(2).is_complex_type()) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
259 ComplexColumnVector v1 (args(0).complex_vector_value());
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
260 ComplexColumnVector v2 (args(1).complex_vector_value());
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
261 ComplexMatrix a (args(2).complex_matrix_value());
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
262 ComplexMatrix c(conv2(v1, v2, a, ishape));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
263 retval(0) = c;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
264 } else {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
265 ColumnVector v1 (args(0).vector_value());
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
266 ColumnVector v2 (args(1).vector_value());
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
267 Matrix a (args(2).matrix_value());
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
268 Matrix c(conv2(v1, v2, a, ishape));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
269 retval(0) = c;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
270 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
271 } else { // if (separable)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
272
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
273 if (args(0).is_complex_type() || args(1).is_complex_type()) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
274 ComplexMatrix a (args(0).complex_matrix_value());
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
275 ComplexMatrix b (args(1).complex_matrix_value());
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
276 ComplexMatrix c(conv2(a, b, ishape));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
277 retval(0) = c;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
278 } else {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
279 Matrix a (args(0).matrix_value());
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
280 Matrix b (args(1).matrix_value());
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
281 Matrix c(conv2(a, b, ishape));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
282 retval(0) = c;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
283 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
284
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
285 } // if (separable)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
286
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
287 return retval;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
288 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
289
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
290
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
291 template MArray2<double>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
292 conv2 (MArray<double>&, MArray<double>&, MArray2<double>&, int);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
293
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
294 template MArray2<double>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
295 conv2 (MArray2<double>&, MArray2<double>&, int);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
296
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
297 template MArray2<Complex>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
298 conv2 (MArray<Complex>&, MArray<Complex>&, MArray2<Complex>&, int);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
299
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
300 template MArray2<Complex>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
301 conv2 (MArray2<Complex>&, MArray2<Complex>&, int);