Mercurial > octave-nkf
annotate src/DLD-FUNCTIONS/filter.cc @ 9153:5247e89688e1
Eliminate most overfull errors when running texi2pdf for generating pdf documentation
Use @smallexample when necessary to reduce font for long lines.
Reword variables or phrases so that Tex can break them at a better spot.
author | Rik <rdrider0-list@yahoo.com> |
---|---|
date | Fri, 24 Apr 2009 12:29:01 -0700 |
parents | 7c02ec148a3c |
children | 8cc2d087f3c1 |
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\ |
9153
5247e89688e1
Eliminate most overfull errors when running texi2pdf for generating pdf documentation
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
299 @c Set example in small font to prevent overfull line\n\ |
3367 | 300 @smallexample\n\ |
301 N M\n\ | |
302 SUM a(k+1) y(n-k) = SUM b(k+1) x(n-k) for 1<=n<=length(x)\n\ | |
303 k=0 k=0\n\ | |
304 @end smallexample\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
305 @end ifnottex\n\ |
2928 | 306 \n\ |
3367 | 307 @noindent\n\ |
308 where\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
309 @ifnottex\n\ |
3367 | 310 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
|
311 @end ifnottex\n\ |
3367 | 312 @iftex\n\ |
313 @tex\n\ | |
314 $a \\in \\Re^{N-1}$, $b \\in \\Re^{M-1}$, and $x \\in \\Re^P$.\n\ | |
315 @end tex\n\ | |
316 @end iftex\n\ | |
4844 | 317 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
|
318 supplied. An equivalent form of this equation is:\n\ |
3367 | 319 @iftex\n\ |
320 @tex\n\ | |
321 $$\n\ | |
322 y_n = -\\sum_{k=1}^N c_{k+1} y_{n-k} + \\sum_{k=0}^M d_{k+1} x_{n-k}, \\qquad\n\ | |
323 1 \\le n \\le P\n\ | |
324 $$\n\ | |
325 @end tex\n\ | |
326 @end iftex\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
327 @ifnottex\n\ |
2928 | 328 \n\ |
9153
5247e89688e1
Eliminate most overfull errors when running texi2pdf for generating pdf documentation
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
329 @c Set example in small font to prevent overfull line\n\ |
3367 | 330 @smallexample\n\ |
331 N M\n\ | |
332 y(n) = - SUM c(k+1) y(n-k) + SUM d(k+1) x(n-k) for 1<=n<=length(x)\n\ | |
333 k=1 k=0\n\ | |
334 @end smallexample\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
335 @end ifnottex\n\ |
3367 | 336 \n\ |
337 @noindent\n\ | |
338 where\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
339 @ifnottex\n\ |
3367 | 340 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
|
341 @end ifnottex\n\ |
3367 | 342 @iftex\n\ |
343 @tex\n\ | |
344 $c = a/a_1$ and $d = b/a_1$.\n\ | |
345 @end tex\n\ | |
346 @end iftex\n\ | |
347 \n\ | |
348 If the fourth argument @var{si} is provided, it is taken as the\n\ | |
349 initial state of the system and the final state is returned as\n\ | |
350 @var{sf}. The state vector is a column vector whose length is\n\ | |
351 equal to the length of the longest coefficient vector minus one.\n\ | |
352 If @var{si} is not supplied, the initial state vector is set to all\n\ | |
2928 | 353 zeros.\n\ |
354 \n\ | |
3367 | 355 In terms of the z-transform, y is the result of passing the discrete-\n\ |
356 time signal x through a system characterized by the following rational\n\ | |
357 system function:\n\ | |
358 @iftex\n\ | |
359 @tex\n\ | |
360 $$\n\ | |
361 H(z) = {\\displaystyle\\sum_{k=0}^M d_{k+1} z^{-k}\n\ | |
362 \\over 1 + \\displaystyle\\sum_{k+1}^N c_{k+1} z^{-k}}\n\ | |
363 $$\n\ | |
364 @end tex\n\ | |
365 @end iftex\n\ | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
366 @ifnottex\n\ |
3367 | 367 \n\ |
368 @example\n\ | |
9064
7c02ec148a3c
Check grammar on all .cc files
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
369 @group\n\ |
3367 | 370 M\n\ |
371 SUM d(k+1) z^(-k)\n\ | |
372 k=0\n\ | |
373 H(z) = ----------------------\n\ | |
374 N\n\ | |
6476 | 375 1 + SUM c(k+1) z^(-k)\n\ |
3367 | 376 k=1\n\ |
9064
7c02ec148a3c
Check grammar on all .cc files
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
377 @end group\n\ |
3367 | 378 @end example\n\ |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7789
diff
changeset
|
379 @end ifnottex\n\ |
3367 | 380 @end deftypefn") |
2928 | 381 { |
382 octave_value_list retval; | |
383 | |
384 int nargin = args.length (); | |
385 | |
4844 | 386 if (nargin < 3 || nargin > 5) |
2928 | 387 { |
5823 | 388 print_usage (); |
2928 | 389 return retval; |
390 } | |
391 | |
4844 | 392 const char *errmsg = "filter: arguments a and b must be vectors"; |
393 | |
394 int dim; | |
395 dim_vector x_dims = args(2).dims (); | |
2928 | 396 |
4844 | 397 if (nargin == 5) |
398 { | |
399 dim = args(4).nint_value() - 1; | |
400 if (dim < 0 || dim >= x_dims.length ()) | |
401 { | |
402 error ("filter: filtering over invalid dimension"); | |
403 return retval; | |
404 } | |
405 } | |
406 else | |
407 { | |
408 // Find first non-singleton dimension | |
409 dim = 0; | |
5059 | 410 while (dim < x_dims.length () && x_dims(dim) <= 1) |
4844 | 411 dim++; |
412 | |
413 // All dimensions singleton, pick first dimension | |
414 if (dim == x_dims.length ()) | |
415 dim = 0; | |
416 } | |
2928 | 417 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
418 bool isfloat = (args(0).is_single_type () |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
419 || args(1).is_single_type () |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
420 || args(2).is_single_type () |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
421 || (nargin >= 4 && args(3).is_single_type ())); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
422 |
2928 | 423 if (args(0).is_complex_type () |
424 || args(1).is_complex_type () | |
425 || args(2).is_complex_type () | |
4844 | 426 || (nargin >= 4 && args(3).is_complex_type ())) |
2928 | 427 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
428 if (isfloat) |
2928 | 429 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
430 FloatComplexColumnVector b (args(0).float_complex_vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
431 FloatComplexColumnVector a (args(1).float_complex_vector_value ()); |
3088 | 432 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
433 FloatComplexNDArray x (args(2).float_complex_array_value ()); |
3088 | 434 |
435 if (! error_state) | |
436 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
437 FloatComplexNDArray si; |
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 if (nargin == 3 || args(3).is_empty ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
440 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
441 octave_idx_type a_len = a.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
442 octave_idx_type b_len = b.length (); |
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 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
|
445 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
446 dim_vector si_dims = x.dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
447 for (int i = dim; i > 0; i--) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
448 si_dims(i) = si_dims(i-1); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
449 si_dims(0) = si_len; |
3088 | 450 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
451 si.resize (si_dims, 0.0); |
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 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
454 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
455 dim_vector si_dims = args (3).dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
456 bool si_is_vector = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
457 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
|
458 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
|
459 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
460 si_is_vector = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
461 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
462 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
463 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
464 si = args(3).float_complex_array_value (); |
2928 | 465 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
466 if (si_is_vector) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
467 si = si.reshape (dim_vector (si.numel (), 1)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
468 } |
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 (! error_state) |
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 FloatComplexNDArray y (filter (b, a, x, si, dim)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
473 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
474 if (nargout == 2) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
475 retval(1) = si; |
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 retval(0) = y; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
478 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
479 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
480 error (errmsg); |
2928 | 481 } |
482 else | |
3088 | 483 error (errmsg); |
2928 | 484 } |
485 else | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
486 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
487 ComplexColumnVector b (args(0).complex_vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
488 ComplexColumnVector a (args(1).complex_vector_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 ComplexNDArray x (args(2).complex_array_value ()); |
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 (! error_state) |
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 ComplexNDArray si; |
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 if (nargin == 3 || args(3).is_empty ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
497 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
498 octave_idx_type a_len = a.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
499 octave_idx_type b_len = b.length (); |
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 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
|
502 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
503 dim_vector si_dims = x.dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
504 for (int i = dim; i > 0; i--) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
505 si_dims(i) = si_dims(i-1); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
506 si_dims(0) = si_len; |
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 si.resize (si_dims, 0.0); |
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 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
511 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
512 dim_vector si_dims = args (3).dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
513 bool si_is_vector = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
514 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
|
515 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
|
516 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
517 si_is_vector = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
518 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
519 } |
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 si = args(3).complex_array_value (); |
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 (si_is_vector) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
524 si = si.reshape (dim_vector (si.numel (), 1)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
525 } |
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 (! error_state) |
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 ComplexNDArray y (filter (b, a, x, si, dim)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
530 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
531 if (nargout == 2) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
532 retval(1) = si; |
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 retval(0) = y; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
535 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
536 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
537 error (errmsg); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
538 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
539 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
540 error (errmsg); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
541 } |
2928 | 542 } |
543 else | |
544 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
545 if (isfloat) |
2928 | 546 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
547 FloatColumnVector b (args(0).float_vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
548 FloatColumnVector a (args(1).float_vector_value ()); |
3088 | 549 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
550 FloatNDArray x (args(2).float_array_value ()); |
3088 | 551 |
552 if (! error_state) | |
553 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
554 FloatNDArray si; |
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 if (nargin == 3 || args(3).is_empty ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
557 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
558 octave_idx_type a_len = a.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
559 octave_idx_type b_len = b.length (); |
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 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
|
562 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
563 dim_vector si_dims = x.dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
564 for (int i = dim; i > 0; i--) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
565 si_dims(i) = si_dims(i-1); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
566 si_dims(0) = si_len; |
3088 | 567 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
568 si.resize (si_dims, 0.0); |
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 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
571 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
572 dim_vector si_dims = args (3).dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
573 bool si_is_vector = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
574 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
|
575 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
|
576 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
577 si_is_vector = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
578 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
579 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
580 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
581 si = args(3).float_array_value (); |
2928 | 582 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
583 if (si_is_vector) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
584 si = si.reshape (dim_vector (si.numel (), 1)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
585 } |
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 (! error_state) |
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 FloatNDArray y (filter (b, a, x, si, dim)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
590 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
591 if (nargout == 2) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
592 retval(1) = si; |
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 retval(0) = y; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
595 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
596 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
597 error (errmsg); |
2928 | 598 } |
599 else | |
3088 | 600 error (errmsg); |
2928 | 601 } |
602 else | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
603 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
604 ColumnVector b (args(0).vector_value ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
605 ColumnVector a (args(1).vector_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 NDArray x (args(2).array_value ()); |
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 (! error_state) |
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 NDArray si; |
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 if (nargin == 3 || args(3).is_empty ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
614 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
615 octave_idx_type a_len = a.length (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
616 octave_idx_type b_len = b.length (); |
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 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
|
619 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
620 dim_vector si_dims = x.dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
621 for (int i = dim; i > 0; i--) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
622 si_dims(i) = si_dims(i-1); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
623 si_dims(0) = si_len; |
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 si.resize (si_dims, 0.0); |
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 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
628 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
629 dim_vector si_dims = args (3).dims (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
630 bool si_is_vector = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
631 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
|
632 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
|
633 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
634 si_is_vector = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
635 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
636 } |
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 si = args(3).array_value (); |
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 (si_is_vector) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
641 si = si.reshape (dim_vector (si.numel (), 1)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
642 } |
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 (! error_state) |
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 NDArray y (filter (b, a, x, si, dim)); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
647 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
648 if (nargout == 2) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
649 retval(1) = si; |
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 retval(0) = y; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
652 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
653 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
654 error (errmsg); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
655 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
656 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
657 error (errmsg); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
658 } |
2928 | 659 } |
660 | |
661 return retval; | |
662 } | |
663 | |
4844 | 664 template MArrayN<double> |
665 filter (MArray<double>&, MArray<double>&, MArrayN<double>&, | |
666 MArrayN<double>&, int dim); | |
2928 | 667 |
4844 | 668 template MArrayN<double> |
669 filter (MArray<double>&, MArray<double>&, MArrayN<double>&, int dim); | |
2928 | 670 |
4844 | 671 template MArrayN<Complex> |
672 filter (MArray<Complex>&, MArray<Complex>&, MArrayN<Complex>&, | |
673 MArrayN<Complex>&, int dim); | |
2928 | 674 |
4844 | 675 template MArrayN<Complex> |
676 filter (MArray<Complex>&, MArray<Complex>&, MArrayN<Complex>&, int dim); | |
2928 | 677 |
7789
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>&, |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
680 MArrayN<float>&, int dim); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
681 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
682 template MArrayN<float> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
683 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
|
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>&, |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
687 MArrayN<FloatComplex>&, int dim); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
688 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
689 template MArrayN<FloatComplex> |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
690 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
|
691 |
2928 | 692 /* |
693 ;;; Local Variables: *** | |
694 ;;; mode: C++ *** | |
695 ;;; End: *** | |
696 */ |