80 const T zero =
static_cast<T
> (0);
83 error (
"filter: the first element of A must be nonzero");
86 if (dim < 0 || dim > x_dims.
ndims ())
87 error (
"filter: DIM must be a valid dimension");
94 if (si_len != ab_len - 1)
95 error (
"filter: first dimension of SI must be of length max (length (a), length (b)) - 1");
98 error (
"filter: dimensionality of SI and X must agree");
102 if (si_dims(i) != x_dims(i-1))
103 error (
"filter: dimensionality of SI and X must agree");
107 if (si_dims(i) != x_dims(i))
108 error (
"filter: dimensionality of SI and X must agree");
114 if (
norm !=
static_cast<T
> (1.0))
120 if (a_len <= 1 && si_len <= 0)
129 for (
int i = 0; i < dim; i++)
130 x_stride *= x_dims(i);
139 : num + (num / x_stride) * x_stride * (x_len - 1);
149 const T *pb = b.
data ();
150 const T *px =
x.data ();
155 const T *pa = a.
data ();
164 i++, idx += x_stride)
168 const T px_val = px[idx];
169 const T py_val = py[idx];
170 const bool px_nonzero = (px_val != zero);
171 const bool py_nonzero = (py_val != zero);
226 i++, idx += x_stride)
228 const T px_val = px[idx];
229 const bool px_nonzero = (px_val != zero);
246 psi[si_len-1] = pb[si_len] * px_val;
385 int nargin = args.length ();
387 if (nargin < 3 || nargin > 5 || nargout > 2)
395 dim = args(4).strict_int_value () - 1;
396 if (dim < 0 || dim >= x_dims.
ndims ())
397 error (
"filter: DIM must be a valid dimension");
404 const char *a_b_errmsg =
"filter: A and B must be vectors";
405 const char *x_si_errmsg =
"filter: X and SI must be arrays";
407 bool isfloat = (args(0).is_single_type ()
408 || args(1).is_single_type ()
409 || args(2).is_single_type ()
410 || (nargin >= 4 && args(3).is_single_type ()));
412 if (args(0).iscomplex ()
413 || args(1).iscomplex ()
414 || args(2).iscomplex ()
415 || (nargin >= 4 && args(3).iscomplex ()))
425 if (nargin == 3 || args(3).isempty ())
433 for (
int i = dim; i > 0; i--)
434 si_dims(i) = si_dims(i-1);
441 si = args(3).xfloat_complex_array_value (x_si_errmsg);
462 if (nargin == 3 || args(3).isempty ())
470 for (
int i = dim; i > 0; i--)
471 si_dims(i) = si_dims(i-1);
478 si = args(3).xcomplex_array_value (x_si_errmsg);
502 if (nargin == 3 || args(3).isempty ())
510 for (
int i = dim; i > 0; i--)
511 si_dims(i) = si_dims(i-1);
518 si = args(3).xfloat_array_value (x_si_errmsg);
535 NDArray x = args(2).xarray_value (x_si_errmsg);
539 if (nargin == 3 || args(3).isempty ())
547 for (
int i = dim; i > 0; i--)
548 si_dims(i) = si_dims(i-1);
555 si = args(3).xarray_value (x_si_errmsg);
#define DEFUN(name, args_name, nargout_name, doc)
Macro to define a builtin function.
MArray< T > filter(MArray< T > &b, MArray< T > &a, MArray< T > &x, MArray< T > &si, int dim=0)