Mercurial > octave-nkf
annotate src/DLD-FUNCTIONS/filter.cc @ 9064:7c02ec148a3c
Check grammar on all .cc files
Same check as previously done on .m files
Attempt to enforce some conformity in documentation text for rules
such as two spaces after a period, commas around latin abbreviations, etc.
author | Rik <rdrider0-list@yahoo.com> |
---|---|
date | Sat, 28 Mar 2009 13:57:22 -0700 |
parents | eb63fbe60fab |
children | 5247e89688e1 |
rev | line source |
---|---|
2928 | 1 /* |
2 | |
8920 | 3 Copyright (C) 1996, 1997, 1999, 2000, 2002, 2004, 2005, 2006, 2007, |
4 2008, 2009 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\ |
9064
7c02ec148a3c
Check grammar on all .cc files
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
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\ | |
9064
7c02ec148a3c
Check grammar on all .cc files
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
367 @group\n\ |
3367 | 368 M\n\ |
369 SUM d(k+1) z^(-k)\n\ | |
370 k=0\n\ | |
371 H(z) = ----------------------\n\ | |
372 N\n\ | |
6476 | 373 1 + SUM c(k+1) z^(-k)\n\ |
3367 | 374 k=1\n\ |
9064
7c02ec148a3c
Check grammar on all .cc files
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
375 @end group\n\ |
3367 | 376 @end example\n\ |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
377 @end ifnottex\n\ |
3367 | 378 @end deftypefn") |
2928 | 379 { |
380 octave_value_list retval; | |
381 | |
382 int nargin = args.length (); | |
383 | |
4844 | 384 if (nargin < 3 || nargin > 5) |
2928 | 385 { |
5823 | 386 print_usage (); |
2928 | 387 return retval; |
388 } | |
389 | |
4844 | 390 const char *errmsg = "filter: arguments a and b must be vectors"; |
391 | |
392 int dim; | |
393 dim_vector x_dims = args(2).dims (); | |
2928 | 394 |
4844 | 395 if (nargin == 5) |
396 { | |
397 dim = args(4).nint_value() - 1; | |
398 if (dim < 0 || dim >= x_dims.length ()) | |
399 { | |
400 error ("filter: filtering over invalid dimension"); | |
401 return retval; | |
402 } | |
403 } | |
404 else | |
405 { | |
406 // Find first non-singleton dimension | |
407 dim = 0; | |
5059 | 408 while (dim < x_dims.length () && x_dims(dim) <= 1) |
4844 | 409 dim++; |
410 | |
411 // All dimensions singleton, pick first dimension | |
412 if (dim == x_dims.length ()) | |
413 dim = 0; | |
414 } | |
2928 | 415 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
416 bool isfloat = (args(0).is_single_type () |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
417 || args(1).is_single_type () |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
418 || args(2).is_single_type () |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
419 || (nargin >= 4 && args(3).is_single_type ())); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
420 |
2928 | 421 if (args(0).is_complex_type () |
422 || args(1).is_complex_type () | |
423 || args(2).is_complex_type () | |
4844 | 424 || (nargin >= 4 && args(3).is_complex_type ())) |
2928 | 425 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
426 if (isfloat) |
2928 | 427 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
428 FloatComplexColumnVector b (args(0).float_complex_vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
429 FloatComplexColumnVector a (args(1).float_complex_vector_value ()); |
3088 | 430 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
431 FloatComplexNDArray x (args(2).float_complex_array_value ()); |
3088 | 432 |
433 if (! error_state) | |
434 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
435 FloatComplexNDArray si; |
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 if (nargin == 3 || args(3).is_empty ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
438 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
439 octave_idx_type a_len = a.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
440 octave_idx_type b_len = b.length (); |
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 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
|
443 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
444 dim_vector si_dims = x.dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
445 for (int i = dim; i > 0; i--) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
446 si_dims(i) = si_dims(i-1); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
447 si_dims(0) = si_len; |
3088 | 448 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
449 si.resize (si_dims, 0.0); |
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 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
452 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
453 dim_vector si_dims = args (3).dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
454 bool si_is_vector = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
455 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
|
456 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
|
457 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
458 si_is_vector = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
459 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
460 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
461 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
462 si = args(3).float_complex_array_value (); |
2928 | 463 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
464 if (si_is_vector) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
465 si = si.reshape (dim_vector (si.numel (), 1)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
466 } |
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 if (! error_state) |
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 FloatComplexNDArray y (filter (b, a, x, si, dim)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
471 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
472 if (nargout == 2) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
473 retval(1) = si; |
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 retval(0) = y; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
476 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
477 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
478 error (errmsg); |
2928 | 479 } |
480 else | |
3088 | 481 error (errmsg); |
2928 | 482 } |
483 else | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
484 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
485 ComplexColumnVector b (args(0).complex_vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
486 ComplexColumnVector a (args(1).complex_vector_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 ComplexNDArray x (args(2).complex_array_value ()); |
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 if (! error_state) |
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 ComplexNDArray si; |
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 if (nargin == 3 || args(3).is_empty ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
495 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
496 octave_idx_type a_len = a.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
497 octave_idx_type b_len = b.length (); |
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 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
|
500 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
501 dim_vector si_dims = x.dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
502 for (int i = dim; i > 0; i--) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
503 si_dims(i) = si_dims(i-1); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
504 si_dims(0) = si_len; |
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 si.resize (si_dims, 0.0); |
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 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
509 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
510 dim_vector si_dims = args (3).dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
511 bool si_is_vector = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
512 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
|
513 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
|
514 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
515 si_is_vector = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
516 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
517 } |
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 si = args(3).complex_array_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
520 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
521 if (si_is_vector) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
522 si = si.reshape (dim_vector (si.numel (), 1)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
523 } |
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 if (! error_state) |
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 ComplexNDArray y (filter (b, a, x, si, dim)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
528 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
529 if (nargout == 2) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
530 retval(1) = si; |
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 retval(0) = y; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
533 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
534 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
535 error (errmsg); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
536 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
537 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
538 error (errmsg); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
539 } |
2928 | 540 } |
541 else | |
542 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
543 if (isfloat) |
2928 | 544 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
545 FloatColumnVector b (args(0).float_vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
546 FloatColumnVector a (args(1).float_vector_value ()); |
3088 | 547 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
548 FloatNDArray x (args(2).float_array_value ()); |
3088 | 549 |
550 if (! error_state) | |
551 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
552 FloatNDArray si; |
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 if (nargin == 3 || args(3).is_empty ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
555 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
556 octave_idx_type a_len = a.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
557 octave_idx_type b_len = b.length (); |
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 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
|
560 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
561 dim_vector si_dims = x.dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
562 for (int i = dim; i > 0; i--) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
563 si_dims(i) = si_dims(i-1); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
564 si_dims(0) = si_len; |
3088 | 565 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
566 si.resize (si_dims, 0.0); |
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 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
569 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
570 dim_vector si_dims = args (3).dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
571 bool si_is_vector = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
572 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
|
573 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
|
574 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
575 si_is_vector = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
576 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
577 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
578 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
579 si = args(3).float_array_value (); |
2928 | 580 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
581 if (si_is_vector) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
582 si = si.reshape (dim_vector (si.numel (), 1)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
583 } |
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 if (! error_state) |
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 FloatNDArray y (filter (b, a, x, si, dim)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
588 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
589 if (nargout == 2) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
590 retval(1) = si; |
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 retval(0) = y; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
593 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
594 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
595 error (errmsg); |
2928 | 596 } |
597 else | |
3088 | 598 error (errmsg); |
2928 | 599 } |
600 else | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
601 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
602 ColumnVector b (args(0).vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
603 ColumnVector a (args(1).vector_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 NDArray x (args(2).array_value ()); |
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 if (! error_state) |
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 NDArray si; |
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 if (nargin == 3 || args(3).is_empty ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
612 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
613 octave_idx_type a_len = a.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
614 octave_idx_type b_len = b.length (); |
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 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
|
617 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
618 dim_vector si_dims = x.dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
619 for (int i = dim; i > 0; i--) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
620 si_dims(i) = si_dims(i-1); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
621 si_dims(0) = si_len; |
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 si.resize (si_dims, 0.0); |
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 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
626 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
627 dim_vector si_dims = args (3).dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
628 bool si_is_vector = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
629 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
|
630 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
|
631 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
632 si_is_vector = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
633 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
634 } |
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 si = args(3).array_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
637 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
638 if (si_is_vector) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
639 si = si.reshape (dim_vector (si.numel (), 1)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
640 } |
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 if (! error_state) |
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 NDArray y (filter (b, a, x, si, dim)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
645 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
646 if (nargout == 2) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
647 retval(1) = si; |
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 retval(0) = y; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
650 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
651 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
652 error (errmsg); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
653 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
654 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
655 error (errmsg); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
656 } |
2928 | 657 } |
658 | |
659 return retval; | |
660 } | |
661 | |
4844 | 662 template MArrayN<double> |
663 filter (MArray<double>&, MArray<double>&, MArrayN<double>&, | |
664 MArrayN<double>&, int dim); | |
2928 | 665 |
4844 | 666 template MArrayN<double> |
667 filter (MArray<double>&, MArray<double>&, MArrayN<double>&, int dim); | |
2928 | 668 |
4844 | 669 template MArrayN<Complex> |
670 filter (MArray<Complex>&, MArray<Complex>&, MArrayN<Complex>&, | |
671 MArrayN<Complex>&, int dim); | |
2928 | 672 |
4844 | 673 template MArrayN<Complex> |
674 filter (MArray<Complex>&, MArray<Complex>&, MArrayN<Complex>&, int dim); | |
2928 | 675 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
676 template MArrayN<float> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
677 filter (MArray<float>&, MArray<float>&, MArrayN<float>&, |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
678 MArrayN<float>&, int dim); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
679 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
680 template MArrayN<float> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
681 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
|
682 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
683 template MArrayN<FloatComplex> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
684 filter (MArray<FloatComplex>&, MArray<FloatComplex>&, MArrayN<FloatComplex>&, |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
685 MArrayN<FloatComplex>&, int dim); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
686 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
687 template MArrayN<FloatComplex> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
688 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
|
689 |
2928 | 690 /* |
691 ;;; Local Variables: *** | |
692 ;;; mode: C++ *** | |
693 ;;; End: *** | |
694 */ |