Mercurial > octave-nkf
annotate src/DLD-FUNCTIONS/filter.cc @ 8517:81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
author | sh@sh-laptop |
---|---|
date | Wed, 14 Jan 2009 20:44:25 -0500 |
parents | 82be108cc558 |
children | eb63fbe60fab |
rev | line source |
---|---|
2928 | 1 /* |
2 | |
7017 | 3 Copyright (C) 1996, 1997, 1999, 2000, 2002, 2004, 2005, 2006, 2007 |
4 John W. Eaton | |
2928 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
2928 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
2928 | 21 |
22 */ | |
23 | |
24 // Based on Tony Richardson's filter.m. | |
25 // | |
5428 | 26 // Originally translated to C++ by KH (Kurt.Hornik@wu-wien.ac.at) |
2928 | 27 // with help from Fritz Leisch and Andreas Weingessel on Oct 20, 1994. |
28 // | |
29 // Rewritten to use templates to handle both real and complex cases by | |
30 // jwe, Wed Nov 1 19:15:29 1995. | |
31 | |
32 #ifdef HAVE_CONFIG_H | |
33 #include <config.h> | |
34 #endif | |
35 | |
4153 | 36 #include "quit.h" |
37 | |
2928 | 38 #include "defun-dld.h" |
39 #include "error.h" | |
40 #include "oct-obj.h" | |
41 | |
3109 | 42 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL) |
4844 | 43 extern MArrayN<double> |
44 filter (MArray<double>&, MArray<double>&, MArrayN<double>&, int dim); | |
2928 | 45 |
4844 | 46 extern MArrayN<Complex> |
47 filter (MArray<Complex>&, MArray<Complex>&, MArrayN<Complex>&, int dim); | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
48 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
49 extern MArrayN<float> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
50 filter (MArray<float>&, MArray<float>&, MArrayN<float>&, int dim); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
51 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
52 extern MArrayN<FloatComplex> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
53 filter (MArray<FloatComplex>&, MArray<FloatComplex>&, MArrayN<FloatComplex>&, int dim); |
3107 | 54 #endif |
2928 | 55 |
56 template <class T> | |
4844 | 57 MArrayN<T> |
58 filter (MArray<T>& b, MArray<T>& a, MArrayN<T>& x, MArrayN<T>& si, | |
59 int dim = 0) | |
2928 | 60 { |
4844 | 61 MArrayN<T> y; |
2928 | 62 |
5275 | 63 octave_idx_type a_len = a.length (); |
64 octave_idx_type b_len = b.length (); | |
2928 | 65 |
5275 | 66 octave_idx_type ab_len = a_len > b_len ? a_len : b_len; |
2928 | 67 |
68 b.resize (ab_len, 0.0); | |
4844 | 69 if (a_len > 1) |
70 a.resize (ab_len, 0.0); | |
2928 | 71 |
72 T norm = a (0); | |
73 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
74 if (norm == static_cast<T>(0.0)) |
2928 | 75 { |
76 error ("filter: the first element of a must be non-zero"); | |
77 return y; | |
78 } | |
79 | |
4844 | 80 dim_vector x_dims = x.dims (); |
5056 | 81 if (dim < 0 || dim > x_dims.length ()) |
4844 | 82 { |
83 error ("filter: filtering over invalid dimension"); | |
84 return y; | |
85 } | |
86 | |
5275 | 87 octave_idx_type x_len = x_dims(dim); |
4844 | 88 |
89 dim_vector si_dims = si.dims (); | |
5275 | 90 octave_idx_type si_len = si_dims(0); |
4844 | 91 |
92 if (si_len != ab_len - 1) | |
93 { | |
94 error ("filter: first dimension of si must be of length max (length (a), length (b)) - 1"); | |
95 return y; | |
96 } | |
97 | |
5059 | 98 if (si_dims.length () != x_dims.length ()) |
4844 | 99 { |
100 error ("filter: dimensionality of si and x must agree"); | |
101 return y; | |
102 } | |
103 | |
5275 | 104 octave_idx_type si_dim = 0; |
105 for (octave_idx_type i = 0; i < x_dims.length (); i++) | |
4844 | 106 { |
107 if (i == dim) | |
108 continue; | |
5055 | 109 |
110 if (x_dims(i) == 1) | |
111 continue; | |
112 | |
5059 | 113 if (si_dims(++si_dim) != x_dims(i)) |
4844 | 114 { |
115 error ("filter: dimensionality of si and x must agree"); | |
116 return y; | |
117 } | |
118 } | |
2928 | 119 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
120 if (norm != static_cast<T>(1.0)) |
4844 | 121 { |
122 a = a / norm; | |
123 b = b / norm; | |
124 } | |
2928 | 125 |
5056 | 126 if (a_len <= 1 && si_len <= 0) |
4844 | 127 return b(0) * x; |
128 | |
129 y.resize (x_dims, 0.0); | |
130 | |
131 int x_stride = 1; | |
132 for (int i = 0; i < dim; i++) | |
133 x_stride *= x_dims(i); | |
2928 | 134 |
5275 | 135 octave_idx_type x_num = x_dims.numel () / x_len; |
136 for (octave_idx_type num = 0; num < x_num; num++) | |
4844 | 137 { |
5275 | 138 octave_idx_type x_offset; |
4844 | 139 if (x_stride == 1) |
140 x_offset = num * x_len; | |
141 else | |
142 { | |
5275 | 143 octave_idx_type x_offset2 = 0; |
4844 | 144 x_offset = num; |
145 while (x_offset >= x_stride) | |
146 { | |
147 x_offset -= x_stride; | |
148 x_offset2++; | |
149 } | |
150 x_offset += x_offset2 * x_stride * x_len; | |
151 } | |
5275 | 152 octave_idx_type si_offset = num * si_len; |
2928 | 153 |
4844 | 154 if (a_len > 1) |
2928 | 155 { |
5114 | 156 T *py = y.fortran_vec (); |
157 T *psi = si.fortran_vec (); | |
158 | |
159 const T *pa = a.data (); | |
160 const T *pb = b.data (); | |
161 const T *px = x.data (); | |
162 | |
163 psi += si_offset; | |
164 | |
5275 | 165 for (octave_idx_type i = 0, idx = x_offset; i < x_len; i++, idx += x_stride) |
2928 | 166 { |
5114 | 167 py[idx] = psi[0] + pb[0] * px[idx]; |
168 | |
169 if (si_len > 0) | |
170 { | |
5275 | 171 for (octave_idx_type j = 0; j < si_len - 1; j++) |
5114 | 172 { |
173 OCTAVE_QUIT; | |
174 | |
175 psi[j] = psi[j+1] - pa[j+1] * py[idx] + pb[j+1] * px[idx]; | |
176 } | |
177 | |
178 psi[si_len-1] = pb[si_len] * px[idx] - pa[si_len] * py[idx]; | |
179 } | |
180 else | |
181 { | |
182 OCTAVE_QUIT; | |
183 | |
184 psi[0] = pb[si_len] * px[idx] - pa[si_len] * py[idx]; | |
185 } | |
186 } | |
187 } | |
188 else if (si_len > 0) | |
189 { | |
190 T *py = y.fortran_vec (); | |
191 T *psi = si.fortran_vec (); | |
192 | |
193 const T *pb = b.data (); | |
194 const T *px = x.data (); | |
195 | |
196 psi += si_offset; | |
197 | |
5275 | 198 for (octave_idx_type i = 0, idx = x_offset; i < x_len; i++, idx += x_stride) |
5114 | 199 { |
200 py[idx] = psi[0] + pb[0] * px[idx]; | |
4844 | 201 |
202 if (si_len > 1) | |
4153 | 203 { |
5275 | 204 for (octave_idx_type j = 0; j < si_len - 1; j++) |
4844 | 205 { |
206 OCTAVE_QUIT; | |
4153 | 207 |
5114 | 208 psi[j] = psi[j+1] + pb[j+1] * px[idx]; |
4844 | 209 } |
210 | |
5114 | 211 psi[si_len-1] = pb[si_len] * px[idx]; |
4153 | 212 } |
4844 | 213 else |
5114 | 214 { |
215 OCTAVE_QUIT; | |
4844 | 216 |
5114 | 217 psi[0] = pb[1] * px[idx]; |
4844 | 218 } |
219 } | |
2928 | 220 } |
221 } | |
4844 | 222 |
2928 | 223 return y; |
224 } | |
225 | |
3109 | 226 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL) |
4844 | 227 extern MArrayN<double> |
228 filter (MArray<double>&, MArray<double>&, MArrayN<double>&, | |
229 MArrayN<double>&, int dim); | |
2928 | 230 |
4844 | 231 extern MArrayN<Complex> |
232 filter (MArray<Complex>&, MArray<Complex>&, MArrayN<Complex>&, | |
233 MArrayN<Complex>&, int dim); | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
234 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
235 extern MArrayN<float> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
236 filter (MArray<float>&, MArray<float>&, MArrayN<float>&, |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
237 MArrayN<float>&, int dim); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
238 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
239 extern MArrayN<FloatComplex> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
240 filter (MArray<FloatComplex>&, MArray<FloatComplex>&, MArrayN<FloatComplex>&, |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
241 MArrayN<FloatComplex>&, int dim); |
3107 | 242 #endif |
2928 | 243 |
244 template <class T> | |
4844 | 245 MArrayN<T> |
246 filter (MArray<T>& b, MArray<T>& a, MArrayN<T>& x, int dim = -1) | |
2928 | 247 { |
5059 | 248 dim_vector x_dims = x.dims(); |
4844 | 249 |
250 if (dim < 0) | |
251 { | |
252 // Find first non-singleton dimension | |
5059 | 253 while (dim < x_dims.length () && x_dims(dim) <= 1) |
4844 | 254 dim++; |
255 | |
256 // All dimensions singleton, pick first dimension | |
257 if (dim == x_dims.length ()) | |
258 dim = 0; | |
259 } | |
260 else | |
261 if (dim < 0 || dim > x_dims.length ()) | |
262 { | |
263 error ("filter: filtering over invalid dimension"); | |
264 return MArrayN<T> (); | |
265 } | |
266 | |
5275 | 267 octave_idx_type a_len = a.length (); |
268 octave_idx_type b_len = b.length (); | |
2928 | 269 |
5275 | 270 octave_idx_type si_len = (a_len > b_len ? a_len : b_len) - 1; |
4844 | 271 dim_vector si_dims = x.dims (); |
272 for (int i = dim; i > 0; i--) | |
5059 | 273 si_dims(i) = si_dims(i-1); |
274 si_dims(0) = si_len; | |
4844 | 275 |
276 MArrayN<T> si (si_dims, T (0.0)); | |
2928 | 277 |
4844 | 278 return filter (b, a, x, si, dim); |
2928 | 279 } |
280 | |
3097 | 281 DEFUN_DLD (filter, args, nargout, |
3367 | 282 "-*- texinfo -*-\n\ |
283 @deftypefn {Loadable Function} {y =} filter (@var{b}, @var{a}, @var{x})\n\ | |
284 @deftypefnx {Loadable Function} {[@var{y}, @var{sf}] =} filter (@var{b}, @var{a}, @var{x}, @var{si})\n\ | |
4844 | 285 @deftypefnx {Loadable Function} {[@var{y}, @var{sf}] =} filter (@var{b}, @var{a}, @var{x}, [], @var{dim})\n\ |
286 @deftypefnx {Loadable Function} {[@var{y}, @var{sf}] =} filter (@var{b}, @var{a}, @var{x}, @var{si}, @var{dim})\n\ | |
3367 | 287 Return the solution to the following linear, time-invariant difference\n\ |
288 equation:\n\ | |
289 @iftex\n\ | |
290 @tex\n\ | |
291 $$\n\ | |
292 \\sum_{k=0}^N a_{k+1} y_{n-k} = \\sum_{k=0}^M b_{k+1} x_{n-k}, \\qquad\n\ | |
293 1 \\le n \\le P\n\ | |
294 $$\n\ | |
295 @end tex\n\ | |
296 @end iftex\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
297 @ifnottex\n\ |
2928 | 298 \n\ |
3367 | 299 @smallexample\n\ |
300 N M\n\ | |
301 SUM a(k+1) y(n-k) = SUM b(k+1) x(n-k) for 1<=n<=length(x)\n\ | |
302 k=0 k=0\n\ | |
303 @end smallexample\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
304 @end ifnottex\n\ |
2928 | 305 \n\ |
3367 | 306 @noindent\n\ |
307 where\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
308 @ifnottex\n\ |
3367 | 309 N=length(a)-1 and M=length(b)-1.\n\ |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
310 @end ifnottex\n\ |
3367 | 311 @iftex\n\ |
312 @tex\n\ | |
313 $a \\in \\Re^{N-1}$, $b \\in \\Re^{M-1}$, and $x \\in \\Re^P$.\n\ | |
314 @end tex\n\ | |
315 @end iftex\n\ | |
4844 | 316 over the first non-singleton dimension of @var{x} or over @var{dim} if\n\ |
317 supplied. An equivalent form of this equation is:\n\ | |
3367 | 318 @iftex\n\ |
319 @tex\n\ | |
320 $$\n\ | |
321 y_n = -\\sum_{k=1}^N c_{k+1} y_{n-k} + \\sum_{k=0}^M d_{k+1} x_{n-k}, \\qquad\n\ | |
322 1 \\le n \\le P\n\ | |
323 $$\n\ | |
324 @end tex\n\ | |
325 @end iftex\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
326 @ifnottex\n\ |
2928 | 327 \n\ |
3367 | 328 @smallexample\n\ |
329 N M\n\ | |
330 y(n) = - SUM c(k+1) y(n-k) + SUM d(k+1) x(n-k) for 1<=n<=length(x)\n\ | |
331 k=1 k=0\n\ | |
332 @end smallexample\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
333 @end ifnottex\n\ |
3367 | 334 \n\ |
335 @noindent\n\ | |
336 where\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
337 @ifnottex\n\ |
3367 | 338 c = a/a(1) and d = b/a(1).\n\ |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
339 @end ifnottex\n\ |
3367 | 340 @iftex\n\ |
341 @tex\n\ | |
342 $c = a/a_1$ and $d = b/a_1$.\n\ | |
343 @end tex\n\ | |
344 @end iftex\n\ | |
345 \n\ | |
346 If the fourth argument @var{si} is provided, it is taken as the\n\ | |
347 initial state of the system and the final state is returned as\n\ | |
348 @var{sf}. The state vector is a column vector whose length is\n\ | |
349 equal to the length of the longest coefficient vector minus one.\n\ | |
350 If @var{si} is not supplied, the initial state vector is set to all\n\ | |
2928 | 351 zeros.\n\ |
352 \n\ | |
3367 | 353 In terms of the z-transform, y is the result of passing the discrete-\n\ |
354 time signal x through a system characterized by the following rational\n\ | |
355 system function:\n\ | |
356 @iftex\n\ | |
357 @tex\n\ | |
358 $$\n\ | |
359 H(z) = {\\displaystyle\\sum_{k=0}^M d_{k+1} z^{-k}\n\ | |
360 \\over 1 + \\displaystyle\\sum_{k+1}^N c_{k+1} z^{-k}}\n\ | |
361 $$\n\ | |
362 @end tex\n\ | |
363 @end iftex\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
364 @ifnottex\n\ |
3367 | 365 \n\ |
366 @example\n\ | |
367 M\n\ | |
368 SUM d(k+1) z^(-k)\n\ | |
369 k=0\n\ | |
370 H(z) = ----------------------\n\ | |
371 N\n\ | |
6476 | 372 1 + SUM c(k+1) z^(-k)\n\ |
3367 | 373 k=1\n\ |
374 @end example\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
375 @end ifnottex\n\ |
3367 | 376 @end deftypefn") |
2928 | 377 { |
378 octave_value_list retval; | |
379 | |
380 int nargin = args.length (); | |
381 | |
4844 | 382 if (nargin < 3 || nargin > 5) |
2928 | 383 { |
5823 | 384 print_usage (); |
2928 | 385 return retval; |
386 } | |
387 | |
4844 | 388 const char *errmsg = "filter: arguments a and b must be vectors"; |
389 | |
390 int dim; | |
391 dim_vector x_dims = args(2).dims (); | |
2928 | 392 |
4844 | 393 if (nargin == 5) |
394 { | |
395 dim = args(4).nint_value() - 1; | |
396 if (dim < 0 || dim >= x_dims.length ()) | |
397 { | |
398 error ("filter: filtering over invalid dimension"); | |
399 return retval; | |
400 } | |
401 } | |
402 else | |
403 { | |
404 // Find first non-singleton dimension | |
405 dim = 0; | |
5059 | 406 while (dim < x_dims.length () && x_dims(dim) <= 1) |
4844 | 407 dim++; |
408 | |
409 // All dimensions singleton, pick first dimension | |
410 if (dim == x_dims.length ()) | |
411 dim = 0; | |
412 } | |
2928 | 413 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
414 bool isfloat = (args(0).is_single_type () |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
415 || args(1).is_single_type () |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
416 || args(2).is_single_type () |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
417 || (nargin >= 4 && args(3).is_single_type ())); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
418 |
2928 | 419 if (args(0).is_complex_type () |
420 || args(1).is_complex_type () | |
421 || args(2).is_complex_type () | |
4844 | 422 || (nargin >= 4 && args(3).is_complex_type ())) |
2928 | 423 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
424 if (isfloat) |
2928 | 425 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
426 FloatComplexColumnVector b (args(0).float_complex_vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
427 FloatComplexColumnVector a (args(1).float_complex_vector_value ()); |
3088 | 428 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
429 FloatComplexNDArray x (args(2).float_complex_array_value ()); |
3088 | 430 |
431 if (! error_state) | |
432 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
433 FloatComplexNDArray si; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
434 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
435 if (nargin == 3 || args(3).is_empty ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
436 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
437 octave_idx_type a_len = a.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
438 octave_idx_type b_len = b.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
439 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
440 octave_idx_type si_len = (a_len > b_len ? a_len : b_len) - 1; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
441 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
442 dim_vector si_dims = x.dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
443 for (int i = dim; i > 0; i--) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
444 si_dims(i) = si_dims(i-1); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
445 si_dims(0) = si_len; |
3088 | 446 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
447 si.resize (si_dims, 0.0); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
448 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
449 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
450 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
451 dim_vector si_dims = args (3).dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
452 bool si_is_vector = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
453 for (int i = 0; i < si_dims.length (); i++) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
454 if (si_dims(i) != 1 && si_dims(i) < si_dims.numel ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
455 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
456 si_is_vector = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
457 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
458 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
459 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
460 si = args(3).float_complex_array_value (); |
2928 | 461 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
462 if (si_is_vector) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
463 si = si.reshape (dim_vector (si.numel (), 1)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
464 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
465 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
466 if (! error_state) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
467 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
468 FloatComplexNDArray y (filter (b, a, x, si, dim)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
469 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
470 if (nargout == 2) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
471 retval(1) = si; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
472 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
473 retval(0) = y; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
474 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
475 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
476 error (errmsg); |
2928 | 477 } |
478 else | |
3088 | 479 error (errmsg); |
2928 | 480 } |
481 else | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
482 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
483 ComplexColumnVector b (args(0).complex_vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
484 ComplexColumnVector a (args(1).complex_vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
485 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
486 ComplexNDArray x (args(2).complex_array_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
487 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
488 if (! error_state) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
489 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
490 ComplexNDArray si; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
491 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
492 if (nargin == 3 || args(3).is_empty ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
493 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
494 octave_idx_type a_len = a.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
495 octave_idx_type b_len = b.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
496 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
497 octave_idx_type si_len = (a_len > b_len ? a_len : b_len) - 1; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
498 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
499 dim_vector si_dims = x.dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
500 for (int i = dim; i > 0; i--) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
501 si_dims(i) = si_dims(i-1); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
502 si_dims(0) = si_len; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
503 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
504 si.resize (si_dims, 0.0); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
505 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
506 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
507 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
508 dim_vector si_dims = args (3).dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
509 bool si_is_vector = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
510 for (int i = 0; i < si_dims.length (); i++) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
511 if (si_dims(i) != 1 && si_dims(i) < si_dims.numel ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
512 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
513 si_is_vector = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
514 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
515 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
516 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
517 si = args(3).complex_array_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
518 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
519 if (si_is_vector) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
520 si = si.reshape (dim_vector (si.numel (), 1)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
521 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
522 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
523 if (! error_state) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
524 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
525 ComplexNDArray y (filter (b, a, x, si, dim)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
526 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
527 if (nargout == 2) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
528 retval(1) = si; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
529 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
530 retval(0) = y; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
531 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
532 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
533 error (errmsg); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
534 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
535 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
536 error (errmsg); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
537 } |
2928 | 538 } |
539 else | |
540 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
541 if (isfloat) |
2928 | 542 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
543 FloatColumnVector b (args(0).float_vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
544 FloatColumnVector a (args(1).float_vector_value ()); |
3088 | 545 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
546 FloatNDArray x (args(2).float_array_value ()); |
3088 | 547 |
548 if (! error_state) | |
549 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
550 FloatNDArray si; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
551 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
552 if (nargin == 3 || args(3).is_empty ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
553 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
554 octave_idx_type a_len = a.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
555 octave_idx_type b_len = b.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
556 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
557 octave_idx_type si_len = (a_len > b_len ? a_len : b_len) - 1; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
558 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
559 dim_vector si_dims = x.dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
560 for (int i = dim; i > 0; i--) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
561 si_dims(i) = si_dims(i-1); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
562 si_dims(0) = si_len; |
3088 | 563 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
564 si.resize (si_dims, 0.0); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
565 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
566 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
567 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
568 dim_vector si_dims = args (3).dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
569 bool si_is_vector = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
570 for (int i = 0; i < si_dims.length (); i++) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
571 if (si_dims(i) != 1 && si_dims(i) < si_dims.numel ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
572 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
573 si_is_vector = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
574 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
575 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
576 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
577 si = args(3).float_array_value (); |
2928 | 578 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
579 if (si_is_vector) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
580 si = si.reshape (dim_vector (si.numel (), 1)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
581 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
582 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
583 if (! error_state) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
584 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
585 FloatNDArray y (filter (b, a, x, si, dim)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
586 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
587 if (nargout == 2) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
588 retval(1) = si; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
589 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
590 retval(0) = y; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
591 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
592 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
593 error (errmsg); |
2928 | 594 } |
595 else | |
3088 | 596 error (errmsg); |
2928 | 597 } |
598 else | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
599 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
600 ColumnVector b (args(0).vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
601 ColumnVector a (args(1).vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
602 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
603 NDArray x (args(2).array_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
604 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
605 if (! error_state) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
606 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
607 NDArray si; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
608 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
609 if (nargin == 3 || args(3).is_empty ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
610 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
611 octave_idx_type a_len = a.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
612 octave_idx_type b_len = b.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
613 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
614 octave_idx_type si_len = (a_len > b_len ? a_len : b_len) - 1; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
615 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
616 dim_vector si_dims = x.dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
617 for (int i = dim; i > 0; i--) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
618 si_dims(i) = si_dims(i-1); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
619 si_dims(0) = si_len; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
620 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
621 si.resize (si_dims, 0.0); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
622 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
623 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
624 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
625 dim_vector si_dims = args (3).dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
626 bool si_is_vector = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
627 for (int i = 0; i < si_dims.length (); i++) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
628 if (si_dims(i) != 1 && si_dims(i) < si_dims.numel ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
629 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
630 si_is_vector = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
631 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
632 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
633 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
634 si = args(3).array_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
635 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
636 if (si_is_vector) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
637 si = si.reshape (dim_vector (si.numel (), 1)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
638 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
639 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
640 if (! error_state) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
641 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
642 NDArray y (filter (b, a, x, si, dim)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
643 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
644 if (nargout == 2) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
645 retval(1) = si; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
646 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
647 retval(0) = y; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
648 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
649 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
650 error (errmsg); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
651 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
652 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
653 error (errmsg); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
654 } |
2928 | 655 } |
656 | |
657 return retval; | |
658 } | |
659 | |
4844 | 660 template MArrayN<double> |
661 filter (MArray<double>&, MArray<double>&, MArrayN<double>&, | |
662 MArrayN<double>&, int dim); | |
2928 | 663 |
4844 | 664 template MArrayN<double> |
665 filter (MArray<double>&, MArray<double>&, MArrayN<double>&, int dim); | |
2928 | 666 |
4844 | 667 template MArrayN<Complex> |
668 filter (MArray<Complex>&, MArray<Complex>&, MArrayN<Complex>&, | |
669 MArrayN<Complex>&, int dim); | |
2928 | 670 |
4844 | 671 template MArrayN<Complex> |
672 filter (MArray<Complex>&, MArray<Complex>&, MArrayN<Complex>&, int dim); | |
2928 | 673 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
674 template MArrayN<float> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
675 filter (MArray<float>&, MArray<float>&, MArrayN<float>&, |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
676 MArrayN<float>&, int dim); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
677 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
678 template MArrayN<float> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
679 filter (MArray<float>&, MArray<float>&, MArrayN<float>&, int dim); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
680 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
681 template MArrayN<FloatComplex> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
682 filter (MArray<FloatComplex>&, MArray<FloatComplex>&, MArrayN<FloatComplex>&, |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
683 MArrayN<FloatComplex>&, int dim); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
684 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
685 template MArrayN<FloatComplex> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
686 filter (MArray<FloatComplex>&, MArray<FloatComplex>&, MArrayN<FloatComplex>&, int dim); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
687 |
2928 | 688 /* |
689 ;;; Local Variables: *** | |
690 ;;; mode: C++ *** | |
691 ;;; End: *** | |
692 */ |