From octave-maintainers-request at bevo dot che dot wisc dot edu Fri Mar 26 19:05:58 2004 Subject: Patch NDArray for min/max From: David Bateman To: octave-maintainers at bevo dot che dot wisc dot edu Date: Sat, 27 Mar 2004 02:01:46 +0100 --zYM0uCDKw75PZbzx Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Attached is a patch to convert min/max to also use NDArray, and be capable of defining the dimension along which to perform the operation. This makes it compatible with the matlab way of doing this. There are in fact two patches. The smaller one contains just the changes for min/max, while the second cleaner version (it includes the Changlog), includes the three other patches I sent over the last few days 1) load of non existent files 2) doc problems and bug in control toolbox 3) Convert filter for NDArray as well as the min/max stuff. JWE, if you want to include all of my stuff it would be simplier to use the combined patch, otherwise you can find all of the patches individually in other mails to the lists. Regards David -- David Bateman David dot Bateman at motorola dot com Motorola CRM +33 1 69 35 48 04 (Ph) Parc Les Algorithmes, Commune de St Aubin +33 1 69 35 77 01 (Fax) 91193 Gif-Sur-Yvette FRANCE The information contained in this communication has been classified as: [x] General Business Information [ ] Motorola Internal Use Only [ ] Motorola Confidential Proprietary --zYM0uCDKw75PZbzx Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=patch *** ./liboctave/CNDArray.cc.orig 2004-03-26 18:17:12.000000000 +0100 --- ./liboctave/CNDArray.cc 2004-03-26 20:42:05.000000000 +0100 *************** *** 683,688 **** --- 683,874 ---- return ::cat_ra(*this, ra_arg, dim, iidx, move); } + static const Complex Complex_NaN_result (octave_NaN, octave_NaN); + + ComplexNDArray + ComplexNDArray::max (int dim) const + { + ArrayN dummy_idx; + return max (dummy_idx, dim); + } + + ComplexNDArray + ComplexNDArray::max (ArrayN& idx_arg, int dim) const + { + dim_vector dv = dims (); + dim_vector dr = dims (); + + if (dv.numel () == 0 || dim > dv.length () || dim < 0) + return ComplexNDArray (); + + dr(dim) = 1; + + ComplexNDArray result (dr); + idx_arg.resize (dr); + + int x_stride = 1; + int x_len = dv(dim); + for (int i = 0; i < dim; i++) + x_stride *= dv(i); + + for (int i = 0; i < dr.numel (); i++) + { + int x_offset; + if (x_stride == 1) + x_offset = i * x_len; + else + { + int x_offset2 = 0; + x_offset = i; + while (x_offset >= x_stride) + { + x_offset -= x_stride; + x_offset2++; + } + x_offset += x_offset2 * x_stride * x_len; + } + + int idx_j; + + Complex tmp_max; + + double abs_max = octave_NaN; + + for (idx_j = 0; idx_j < x_len; idx_j++) + { + tmp_max = elem (idx_j * x_stride + x_offset); + + if (! octave_is_NaN_or_NA (tmp_max)) + { + abs_max = ::abs(tmp_max); + break; + } + } + + for (int j = idx_j+1; j < x_len; j++) + { + Complex tmp = elem (j * x_stride + x_offset); + + if (octave_is_NaN_or_NA (tmp)) + continue; + + double abs_tmp = ::abs (tmp); + + if (abs_tmp > abs_max) + { + idx_j = j; + tmp_max = tmp; + abs_max = abs_tmp; + } + } + + if (octave_is_NaN_or_NA (tmp_max)) + { + result.elem (i) = Complex_NaN_result; + idx_arg.elem (i) = 0; + } + else + { + result.elem (i) = tmp_max; + idx_arg.elem (i) = idx_j; + } + } + + return result; + } + + ComplexNDArray + ComplexNDArray::min (int dim) const + { + ArrayN dummy_idx; + return min (dummy_idx, dim); + } + + ComplexNDArray + ComplexNDArray::min (ArrayN& idx_arg, int dim) const + { + dim_vector dv = dims (); + dim_vector dr = dims (); + + if (dv.numel () == 0 || dim > dv.length () || dim < 0) + return ComplexNDArray (); + + dr(dim) = 1; + + ComplexNDArray result (dr); + idx_arg.resize (dr); + + int x_stride = 1; + int x_len = dv(dim); + for (int i = 0; i < dim; i++) + x_stride *= dv(i); + + for (int i = 0; i < dr.numel (); i++) + { + int x_offset; + if (x_stride == 1) + x_offset = i * x_len; + else + { + int x_offset2 = 0; + x_offset = i; + while (x_offset >= x_stride) + { + x_offset -= x_stride; + x_offset2++; + } + x_offset += x_offset2 * x_stride * x_len; + } + + int idx_j; + + Complex tmp_min; + + double abs_min = octave_NaN; + + for (idx_j = 0; idx_j < x_len; idx_j++) + { + tmp_min = elem (idx_j * x_stride + x_offset); + + if (! octave_is_NaN_or_NA (tmp_min)) + { + abs_min = ::abs(tmp_min); + break; + } + } + + for (int j = idx_j+1; j < x_len; j++) + { + Complex tmp = elem (j * x_stride + x_offset); + + if (octave_is_NaN_or_NA (tmp)) + continue; + + double abs_tmp = ::abs (tmp); + + if (abs_tmp < abs_min) + { + idx_j = j; + tmp_min = tmp; + abs_min = abs_tmp; + } + } + + if (octave_is_NaN_or_NA (tmp_min)) + { + result.elem (i) = Complex_NaN_result; + idx_arg.elem (i) = 0; + } + else + { + result.elem (i) = tmp_min; + idx_arg.elem (i) = idx_j; + } + } + + return result; + } + NDArray ComplexNDArray::abs (void) const { *************** *** 836,841 **** --- 1022,1162 ---- return is; } + // XXX FIXME XXX -- it would be nice to share code among the min/max + // functions below. + + #define EMPTY_RETURN_CHECK(T) \ + if (nel == 0) \ + return T (dv); + + ComplexNDArray + min (Complex c, const ComplexNDArray& m) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (ComplexNDArray); + + ComplexNDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmin (c, m (i)); + } + + return result; + } + + ComplexNDArray + min (const ComplexNDArray& m, Complex c) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (ComplexNDArray); + + ComplexNDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmin (c, m (i)); + } + + return result; + } + + ComplexNDArray + min (const ComplexNDArray& a, const ComplexNDArray& b) + { + dim_vector dv = a.dims (); + int nel = dv.numel (); + + if (dv != b.dims ()) + { + (*current_liboctave_error_handler) + ("two-arg min expecting args of same size"); + return ComplexNDArray (); + } + + EMPTY_RETURN_CHECK (ComplexNDArray); + + ComplexNDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmin (a (i), b (i)); + } + + return result; + } + + ComplexNDArray + max (Complex c, const ComplexNDArray& m) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (ComplexNDArray); + + ComplexNDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmax (c, m (i)); + } + + return result; + } + + ComplexNDArray + max (const ComplexNDArray& m, Complex c) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (ComplexNDArray); + + ComplexNDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmax (c, m (i)); + } + + return result; + } + + ComplexNDArray + max (const ComplexNDArray& a, const ComplexNDArray& b) + { + dim_vector dv = a.dims (); + int nel = dv.numel (); + + if (dv != b.dims ()) + { + (*current_liboctave_error_handler) + ("two-arg max expecting args of same size"); + return ComplexNDArray (); + } + + EMPTY_RETURN_CHECK (ComplexNDArray); + + ComplexNDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmax (a (i), b (i)); + } + + return result; + } + NDS_CMP_OPS(ComplexNDArray, real, Complex, real) NDS_BOOL_OPS(ComplexNDArray, Complex, 0.0) *** ./liboctave/CNDArray.h.orig 2004-03-26 18:17:23.000000000 +0100 --- ./liboctave/CNDArray.h 2004-03-26 18:26:50.000000000 +0100 *************** *** 89,94 **** --- 89,99 ---- ComplexNDArray sumsq (int dim = -1) const; int cat (const ComplexNDArray& ra_arg, int dim, int iidx, int move); + ComplexNDArray max (int dim = 0) const; + ComplexNDArray max (ArrayN& index, int dim = 0) const; + ComplexNDArray min (int dim = 0) const; + ComplexNDArray min (ArrayN& index, int dim = 0) const; + ComplexNDArray& insert (const NDArray& a, int r, int c); ComplexNDArray& insert (const ComplexNDArray& a, int r, int c); *************** *** 130,135 **** --- 135,148 ---- : MArrayN (d, dv) { } }; + extern ComplexNDArray min (const Complex& c, const ComplexNDArray& m); + extern ComplexNDArray min (const ComplexNDArray& m, const Complex& c); + extern ComplexNDArray min (const ComplexNDArray& a, const ComplexNDArray& b); + + extern ComplexNDArray max (const Complex& c, const ComplexNDArray& m); + extern ComplexNDArray max (const ComplexNDArray& m, const Complex& c); + extern ComplexNDArray max (const ComplexNDArray& a, const ComplexNDArray& b); + NDS_CMP_OP_DECLS (ComplexNDArray, Complex) NDS_BOOL_OP_DECLS (ComplexNDArray, Complex) *** ./liboctave/dNDArray.cc.orig 2004-03-26 18:17:33.000000000 +0100 --- ./liboctave/dNDArray.cc 2004-03-26 20:39:23.000000000 +0100 *************** *** 660,670 **** NDArray::max (int dim) const { ArrayN dummy_idx; ! return max (dim, dummy_idx); } NDArray ! NDArray::max (int dim, ArrayN& idx_arg) const { dim_vector dv = dims (); dim_vector dr = dims (); --- 660,670 ---- NDArray::max (int dim) const { ArrayN dummy_idx; ! return max (dummy_idx, dim); } NDArray ! NDArray::max (ArrayN& idx_arg, int dim) const { dim_vector dv = dims (); dim_vector dr = dims (); *************** *** 711,717 **** break; } ! for (int j = idx_j+1; j < nc; j++) { double tmp = elem (j * x_stride + x_offset); --- 711,717 ---- break; } ! for (int j = idx_j+1; j < x_len; j++) { double tmp = elem (j * x_stride + x_offset); *************** *** 731,736 **** --- 731,811 ---- return result; } + NDArray + NDArray::min (int dim) const + { + ArrayN dummy_idx; + return min (dummy_idx, dim); + } + + NDArray + NDArray::min (ArrayN& idx_arg, int dim) const + { + dim_vector dv = dims (); + dim_vector dr = dims (); + + if (dv.numel () == 0 || dim > dv.length () || dim < 0) + return NDArray (); + + dr(dim) = 1; + + NDArray result (dr); + idx_arg.resize (dr); + + int x_stride = 1; + int x_len = dv(dim); + for (int i = 0; i < dim; i++) + x_stride *= dv(i); + + for (int i = 0; i < dr.numel (); i++) + { + int x_offset; + if (x_stride == 1) + x_offset = i * x_len; + else + { + int x_offset2 = 0; + x_offset = i; + while (x_offset >= x_stride) + { + x_offset -= x_stride; + x_offset2++; + } + x_offset += x_offset2 * x_stride * x_len; + } + + int idx_j; + + double tmp_min = octave_NaN; + + for (idx_j = 0; idx_j < x_len; idx_j++) + { + tmp_min = elem (idx_j * x_stride + x_offset); + + if (! octave_is_NaN_or_NA (tmp_min)) + break; + } + + for (int j = idx_j+1; j < x_len; j++) + { + double tmp = elem (j * x_stride + x_offset); + + if (octave_is_NaN_or_NA (tmp)) + continue; + else if (tmp < tmp_min) + { + idx_j = j; + tmp_min = tmp; + } + } + + result.elem (i) = tmp_min; + idx_arg.elem (i) = octave_is_NaN_or_NA (tmp_min) ? 0 : idx_j; + } + + return result; + } + int NDArray::cat (const NDArray& ra_arg, int dim, int iidx, int move) { *************** *** 851,856 **** --- 926,1066 ---- return is; } + // XXX FIXME XXX -- it would be nice to share code among the min/max + // functions below. + + #define EMPTY_RETURN_CHECK(T) \ + if (nel == 0) \ + return T (dv); + + NDArray + min (double d, const NDArray& m) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (NDArray); + + NDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmin (d, m (i)); + } + + return result; + } + + NDArray + min (const NDArray& m, double d) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (NDArray); + + NDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmin (d, m (i)); + } + + return result; + } + + NDArray + min (const NDArray& a, const NDArray& b) + { + dim_vector dv = a.dims (); + int nel = dv.numel (); + + if (dv != b.dims ()) + { + (*current_liboctave_error_handler) + ("two-arg min expecting args of same size"); + return NDArray (); + } + + EMPTY_RETURN_CHECK (NDArray); + + NDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmin (a (i), b (i)); + } + + return result; + } + + NDArray + max (double d, const NDArray& m) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (NDArray); + + NDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmax (d, m (i)); + } + + return result; + } + + NDArray + max (const NDArray& m, double d) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (NDArray); + + NDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmax (d, m (i)); + } + + return result; + } + + NDArray + max (const NDArray& a, const NDArray& b) + { + dim_vector dv = a.dims (); + int nel = dv.numel (); + + if (dv != b.dims ()) + { + (*current_liboctave_error_handler) + ("two-arg max expecting args of same size"); + return NDArray (); + } + + EMPTY_RETURN_CHECK (NDArray); + + NDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmax (a (i), b (i)); + } + + return result; + } + NDS_CMP_OPS(NDArray, , double, ) NDS_BOOL_OPS(NDArray, double, 0.0) *** ./liboctave/dNDArray.h.orig 2004-03-26 18:17:38.000000000 +0100 --- ./liboctave/dNDArray.h 2004-03-26 18:26:17.000000000 +0100 *************** *** 87,93 **** NDArray sum (int dim = -1) const; NDArray sumsq (int dim = -1) const; int cat (const NDArray& ra_arg, int dim, int iidx, int move); ! NDArray abs (void) const; ComplexNDArray fourier (int dim = 1) const; --- 87,98 ---- NDArray sum (int dim = -1) const; NDArray sumsq (int dim = -1) const; int cat (const NDArray& ra_arg, int dim, int iidx, int move); ! ! NDArray max (int dim = 0) const; ! NDArray max (ArrayN& index, int dim = 0) const; ! NDArray min (int dim = 0) const; ! NDArray min (ArrayN& index, int dim = 0) const; ! NDArray abs (void) const; ComplexNDArray fourier (int dim = 1) const; *************** *** 125,130 **** --- 130,143 ---- NDArray (double *d, const dim_vector& dv) : MArrayN (d, dv) { } }; + extern NDArray min (double d, const NDArray& m); + extern NDArray min (const NDArray& m, double d); + extern NDArray min (const NDArray& a, const NDArray& b); + + extern NDArray max (double d, const NDArray& m); + extern NDArray max (const NDArray& m, double d); + extern NDArray max (const NDArray& a, const NDArray& b); + NDS_CMP_OP_DECLS (NDArray, double) NDS_BOOL_OP_DECLS (NDArray, double) *** ./liboctave/ChangeLog.orig 2004-03-27 01:44:39.000000000 +0100 --- ./liboctave/ChangeLog 2004-03-27 01:44:43.000000000 +0100 *************** *** 1,3 **** --- 1,14 ---- + 2004-03-26 David Bateman + + * dNDArray.cc (NDArray::min, NDArray::max, min, max): + Min and Max functions for NDArrays. + * dNDArray.h (NDArray::min, NDArray::max, min, max): Decl. + + * CNDArray.cc (ComplexNDArray::min, ComplexNDArray::max, min, max): + Min and Max functions for ComplexNDArrays. + * CNDArray.h (ComplexNDArray::min, ComplexNDArray::max, min, max): + Decl. + 2004-03-11 John W. Eaton * so-array.cc (SND_CMP_OP, NDS_CMP_OP, NDND_CMP_OP): *** ./scripts/control/base/bode.m.orig 2004-02-16 20:57:22.000000000 +0100 --- ./scripts/control/base/bode.m 2004-03-25 21:44:58.000000000 +0100 *************** *** 67,73 **** ## ## at strong{Example} ## at example ! ## bode(sys,[],"y_3",list("u_1","u_4"); ## at end example ## at end table ## at strong{Outputs} --- 67,73 ---- ## ## at strong{Example} ## at example ! ## bode(sys,[],"y_3", at {"u_1","u_4"@}); ## at end example ## at end table ## at strong{Outputs} *** ./scripts/control/base/lqg.m.orig 2004-02-16 20:57:22.000000000 +0100 --- ./scripts/control/base/lqg.m 2004-03-25 18:43:57.000000000 +0100 *************** *** 40,46 **** ## at itemx r ## state, control weighting respectively. Control ARE is ## at item in_idx ! ## names or indices of controlled inputs (see at code{sysidx}, @code{listidx}) ## ## default: last dim(R) inputs are assumed to be controlled inputs, all ## others are assumed to be noise inputs. --- 40,46 ---- ## at itemx r ## state, control weighting respectively. Control ARE is ## at item in_idx ! ## names or indices of controlled inputs (see at code{sysidx}, @code{cellidx}) ## ## default: last dim(R) inputs are assumed to be controlled inputs, all ## others are assumed to be noise inputs. *** ./scripts/control/system/ss2sys.m.orig 2004-02-16 20:57:22.000000000 +0100 --- ./scripts/control/system/ss2sys.m 2004-03-25 21:46:25.000000000 +0100 *************** *** 46,63 **** ## see below for system partitioning ## ## at item stname ! ## list of strings of state signal names ## ## default ( at var{stname}=[] on input): @code{x_n} for continuous states, ## at code{xd_n} for discrete states ## ## at item inname ! ## list of strings of input signal names ## ## default ( at var{inname} = [] on input): @code{u_n} ## ## at item outname ! ## list of strings of input signal names ## ## default ( at var{outname} = [] on input): @code{y_n} ## --- 46,63 ---- ## see below for system partitioning ## ## at item stname ! ## cell array of strings of state signal names ## ## default ( at var{stname}=[] on input): @code{x_n} for continuous states, ## at code{xd_n} for discrete states ## ## at item inname ! ## cell array of strings of input signal names ## ## default ( at var{inname} = [] on input): @code{u_n} ## ## at item outname ! ## cell array of strings of input signal names ## ## default ( at var{outname} = [] on input): @code{y_n} ## *************** *** 140,146 **** ## octave:1> a = [1 2 3; 4 5 6; 7 8 10]; ## octave:2> b = [0 0 ; 0 1 ; 1 0]; ## octave:3> c = eye(3); ! ## octave:4> sys = ss(a,b,c,[],0,3,0,list("volts","amps","joules")); ## octave:5> sysout(sys); ## Input(s) ## 1: u_1 --- 140,146 ---- ## octave:1> a = [1 2 3; 4 5 6; 7 8 10]; ## octave:2> b = [0 0 ; 0 1 ; 1 0]; ## octave:3> c = eye(3); ! ## octave:4> sys = ss(a,b,c,[],0,3,0, at {"volts","amps","joules"@}); ## octave:5> sysout(sys); ## Input(s) ## 1: u_1 *** ./scripts/control/system/cellidx.m.orig 2004-02-17 03:34:33.000000000 +0100 --- ./scripts/control/system/cellidx.m 2004-03-25 18:43:01.000000000 +0100 *************** *** 17,23 **** ## Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. ## -*- texinfo -*- ! ## at deftypefn {Function File} {[@var{idxvec}, @var{errmsg}] =} listidx (@var{listvar}, @var{strlist}) ## Return indices of string entries in at var{listvar} that match strings ## in at var{strlist} dot ## --- 17,23 ---- ## Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. ## -*- texinfo -*- ! ## at deftypefn {Function File} {[@var{idxvec}, @var{errmsg}] =} cellidx (@var{listvar}, @var{strlist}) ## Return indices of string entries in at var{listvar} that match strings ## in at var{strlist} dot ## *************** *** 29,35 **** ## ## If at var{strlist} contains a string not in @var{listvar}, then ## an error message is returned in at var{errmsg} dot If only one output ! ## argument is requested, then at var{listidx} prints @var{errmsg} to the ## screen and exits with an error. ## at end deftypefn --- 29,35 ---- ## ## If at var{strlist} contains a string not in @var{listvar}, then ## an error message is returned in at var{errmsg} dot If only one output ! ## argument is requested, then at var{cellidx} prints @var{errmsg} to the ## screen and exits with an error. ## at end deftypefn *** ./scripts/control/system/dmr2d.m.orig 2004-02-16 20:57:22.000000000 +0100 --- ./scripts/control/system/dmr2d.m 2004-03-25 18:43:20.000000000 +0100 *************** *** 29,35 **** ## at code{dmr2d} exits with an error if @var{sys} is not discrete ## at item idx ## indices or names of states with sampling time ! ## at code{sysgettsam(@var{sys})} (may be empty); see @code{listidx} ## at item sprefix ## list of string prefixes of states with sampling time ## at code{sysgettsam(@var{sys})} (may be empty) --- 29,35 ---- ## at code{dmr2d} exits with an error if @var{sys} is not discrete ## at item idx ## indices or names of states with sampling time ! ## at code{sysgettsam(@var{sys})} (may be empty); see @code{cellidx} ## at item sprefix ## list of string prefixes of states with sampling time ## at code{sysgettsam(@var{sys})} (may be empty) *** ./scripts/control/system/ss.m.orig 2004-02-17 03:34:33.000000000 +0100 --- ./scripts/control/system/ss.m 2004-03-25 21:46:39.000000000 +0100 *************** *** 46,63 **** ## see below for system partitioning ## ## at item stname ! ## list of strings of state signal names ## ## default ( at var{stname}=[] on input): @code{x_n} for continuous states, ## at code{xd_n} for discrete states ## ## at item inname ! ## list of strings of input signal names ## ## default ( at var{inname} = [] on input): @code{u_n} ## ## at item outname ! ## list of strings of input signal names ## ## default ( at var{outname} = [] on input): @code{y_n} ## --- 46,63 ---- ## see below for system partitioning ## ## at item stname ! ## cell array of strings of state signal names ## ## default ( at var{stname}=[] on input): @code{x_n} for continuous states, ## at code{xd_n} for discrete states ## ## at item inname ! ## cell array of strings of input signal names ## ## default ( at var{inname} = [] on input): @code{u_n} ## ## at item outname ! ## cell array of strings of input signal names ## ## default ( at var{outname} = [] on input): @code{y_n} ## *************** *** 140,146 **** ## octave:1> a = [1 2 3; 4 5 6; 7 8 10]; ## octave:2> b = [0 0 ; 0 1 ; 1 0]; ## octave:3> c = eye(3); ! ## octave:4> sys = ss(a,b,c,[],0,3,0,list("volts","amps","joules")); ## octave:5> sysout(sys); ## Input(s) ## 1: u_1 --- 140,146 ---- ## octave:1> a = [1 2 3; 4 5 6; 7 8 10]; ## octave:2> b = [0 0 ; 0 1 ; 1 0]; ## octave:3> c = eye(3); ! ## octave:4> sys = ss(a,b,c,[],0,3,0, at {"volts","amps","joules"@}); ## octave:5> sysout(sys); ## Input(s) ## 1: u_1 *** ./scripts/control/system/sysidx.m.orig 2002-08-09 20:58:14.000000000 +0200 --- ./scripts/control/system/sysidx.m 2004-03-25 18:44:41.000000000 +0100 *************** *** 38,50 **** endif ## extract correct set of signal names values ! [idxvec, msg] = listidx (list ("in", "out", "st", "yd"), sigtype); if (msg) error ("invalid sigtype = %s", sigtype); endif syssiglist = sysgetsignals (sys, sigtype); ! [idxvec, msg] = listidx (syssiglist, signamelist); if (length (msg)) error ("sysidx (sigtype = %s): %s", sigtype, strrep (msg, "strlist", "signamelist")); --- 38,50 ---- endif ## extract correct set of signal names values ! [idxvec, msg] = cellidx ({"in", "out", "st", "yd"}, sigtype); if (msg) error ("invalid sigtype = %s", sigtype); endif syssiglist = sysgetsignals (sys, sigtype); ! [idxvec, msg] = cellidx (syssiglist, signamelist); if (length (msg)) error ("sysidx (sigtype = %s): %s", sigtype, strrep (msg, "strlist", "signamelist")); *** ./scripts/control/system/sysprune.m.orig 2004-02-16 20:57:22.000000000 +0100 --- ./scripts/control/system/sysprune.m 2004-03-25 21:58:22.000000000 +0100 *************** *** 33,39 **** ## ## at example ## retsys = sysprune(Asys,[1:3,4],"u_1"); ! ## retsys = sysprune(Asys,list("tx","ty","tz"), 4); ## at end example ## ## at end table --- 33,39 ---- ## ## at example ## retsys = sysprune(Asys,[1:3,4],"u_1"); ! ## retsys = sysprune(Asys, at {"tx","ty","tz"@}, 4); ## at end example ## ## at end table *** ./scripts/ChangeLog.orig 2004-03-12 20:26:56.000000000 +0100 --- ./scripts/ChangeLog 2004-03-25 22:01:06.000000000 +0100 *************** *** 1,3 **** --- 1,10 ---- + 2004-03-25 David Bateman + * control/base/bode.m, control/base/lqg.m, control/system/ss2sys.m, + control/system/cellidx.m, control/system/dmr2d.m control/system/ss.m, + control/system/sysprune.m: Doc update for usage of cell arrays. + + * control/system/sysidx.m: Use cellidx and not listidx. + 2004-03-12 Stefan van der Walt * image/imshow.m: Accept "truesize" argument. *** ./src/DLD-FUNCTIONS/filter.cc.orig 2004-03-26 12:21:58.000000000 +0100 --- ./src/DLD-FUNCTIONS/filter.cc 2004-03-26 15:49:32.000000000 +0100 *************** *** 39,170 **** #include "oct-obj.h" #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL) ! extern MArray ! filter (MArray&, MArray&, MArray&); ! extern MArray ! filter (MArray&, MArray&, MArray&); #endif template ! MArray ! filter (MArray& b, MArray& a, MArray& x, MArray& si) { ! MArray y; int a_len = a.length (); int b_len = b.length (); - int x_len = x.length (); - - int si_len = si.length (); int ab_len = a_len > b_len ? a_len : b_len; b.resize (ab_len, 0.0); ! if (si.length () != ab_len - 1) { ! error ("filter: si must be a vector of length max (length (a), length (b)) - 1"); return y; } ! T norm = a (0); ! if (norm == 0.0) { ! error ("filter: the first element of a must be non-zero"); return y; } ! y.resize (x_len, 0.0); ! if (norm != 1.0) ! b = b / norm; ! if (a_len > 1) { ! a.resize (ab_len, 0.0); ! if (norm != 1.0) ! a = a / norm; ! for (int i = 0; i < x_len; i++) { ! y (i) = si (0) + b (0) * x (i); ! if (si_len > 1) { ! for (int j = 0; j < si_len - 1; j++) { ! OCTAVE_QUIT; ! si (j) = si (j+1) - a (j+1) * y (i) ! + b (j+1) * x (i); } ! ! si (si_len-1) = b (si_len) * x (i) ! - a (si_len) * y (i); } - else - si (0) = b (si_len) * x (i) - - a (si_len) * y (i); } ! } ! else if (si_len > 0) ! { ! for (int i = 0; i < x_len; i++) { ! y (i) = si (0) + b (0) * x (i); ! ! if (si_len > 1) { ! for (int j = 0; j < si_len - 1; j++) { ! OCTAVE_QUIT; ! si (j) = si (j+1) + b (j+1) * x (i); } ! ! si (si_len-1) = b (si_len) * x (i); } - else - si (0) = b (1) * x (i); } } ! else ! y = b (0) * x; ! return y; } #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL) ! extern MArray ! filter (MArray&, MArray&, MArray&, ! MArray&); ! ! extern MArray ! filter (MArray&, MArray&, MArray&, ! MArray&); #endif template ! MArray ! filter (MArray& b, MArray& a, MArray& x) { int a_len = a.length (); int b_len = b.length (); int si_len = (a_len > b_len ? a_len : b_len) - 1; ! MArray si (si_len, T (0.0)); ! ! return filter (b, a, x, si); } DEFUN_DLD (filter, args, nargout, "-*- texinfo -*-\n\ at deftypefn {Loadable Function} {y =} filter (@var{b}, @var{a}, @var{x})\n\ at deftypefnx {Loadable Function} {[@var{y}, @var{sf}] =} filter (@var{b}, @var{a}, @var{x}, @var{si})\n\ Return the solution to the following linear, time-invariant difference\n\ equation:\n\ at iftex\n\ --- 39,252 ---- #include "oct-obj.h" #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL) ! extern MArrayN ! filter (MArray&, MArray&, MArrayN&, int dim); ! extern MArrayN ! filter (MArray&, MArray&, MArrayN&, int dim); #endif template ! MArrayN ! filter (MArray& b, MArray& a, MArrayN& x, MArrayN& si, ! int dim = 0) { ! MArrayN y; int a_len = a.length (); int b_len = b.length (); int ab_len = a_len > b_len ? a_len : b_len; b.resize (ab_len, 0.0); + if (a_len > 1) + a.resize (ab_len, 0.0); ! T norm = a (0); ! ! if (norm == 0.0) { ! error ("filter: the first element of a must be non-zero"); return y; } ! dim_vector x_dims = x.dims (); ! if ((dim < 0) || (dim > x_dims.length ())) ! { ! error ("filter: filtering over invalid dimension"); ! return y; ! } ! int x_len = x_dims (dim); ! ! dim_vector si_dims = si.dims (); ! int si_len = si_dims (0); ! ! if (si_len != ab_len - 1) { ! error ("filter: first dimension of si must be of length max (length (a), length (b)) - 1"); return y; } ! if (si_dims.length () != x_dims.length ()) ! { ! error ("filter: dimensionality of si and x must agree"); ! return y; ! } ! int si_dim = 0; ! for (int i = 0; i < x_dims.length (); i++) ! { ! if (i == dim) ! continue; ! ! if (si_dims (++si_dim) != x_dims (i)) ! { ! error ("filter: dimensionality of si and x must agree"); ! return y; ! } ! } ! if (norm != 1.0) { ! a = a / norm; ! b = b / norm; ! } ! if ((a_len <= 1) && (si_len <= 1)) ! return b(0) * x; ! y.resize (x_dims, 0.0); ! ! int x_stride = 1; ! for (int i = 0; i < dim; i++) ! x_stride *= x_dims(i); ! ! int x_num = x_dims.numel () / x_len; ! for (int num = 0; num < x_num; num++) ! { ! int x_offset; ! if (x_stride == 1) ! x_offset = num * x_len; ! else { ! int x_offset2 = 0; ! x_offset = num; ! while (x_offset >= x_stride) ! { ! x_offset -= x_stride; ! x_offset2++; ! } ! x_offset += x_offset2 * x_stride * x_len; ! } ! int si_offset = num * si_len; ! if (a_len > 1) ! { ! for (int i = 0; i < x_len; i++) { ! int idx = i * x_stride + x_offset; ! y (idx) = si (si_offset) + b (0) * x (idx); ! ! if (si_len > 1) { ! for (int j = 0; j < si_len - 1; j++) ! { ! OCTAVE_QUIT; ! ! si (j + si_offset) = si (j + 1 + si_offset) - ! a (j+1) * y (idx) + b (j+1) * x (idx); ! } ! si (si_len - 1 + si_offset) = b (si_len) * x (idx) ! - a (si_len) * y (idx); } ! else ! si (si_offset) = b (si_len) * x (idx) ! - a (si_len) * y (idx); } } ! else if (si_len > 0) { ! for (int i = 0; i < x_len; i++) { ! int idx = i * x_stride + x_offset; ! y (idx) = si (si_offset) + b (0) * x (idx); ! ! if (si_len > 1) { ! for (int j = 0; j < si_len - 1; j++) ! { ! OCTAVE_QUIT; ! ! si (j + si_offset) = si (j + 1 + si_offset) + ! b (j+1) * x (idx); ! } ! si (si_len - 1 + si_offset) = b (si_len) * x (idx); } ! else ! si (si_offset) = b (1) * x (idx); } } } ! return y; } #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL) ! extern MArrayN ! filter (MArray&, MArray&, MArrayN&, ! MArrayN&, int dim); ! ! extern MArrayN ! filter (MArray&, MArray&, MArrayN&, ! MArrayN&, int dim); #endif template ! MArrayN ! filter (MArray& b, MArray& a, MArrayN& x, int dim = -1) { + dim_vector x_dims = x.dims (); + + if (dim < 0) + { + // Find first non-singleton dimension + while ((dim < x_dims.length()) && (x_dims (dim) <= 1)) + dim++; + + // All dimensions singleton, pick first dimension + if (dim == x_dims.length ()) + dim = 0; + } + else + if (dim < 0 || dim > x_dims.length ()) + { + error ("filter: filtering over invalid dimension"); + return MArrayN (); + } + int a_len = a.length (); int b_len = b.length (); int si_len = (a_len > b_len ? a_len : b_len) - 1; + dim_vector si_dims = x.dims (); + for (int i = dim; i > 0; i--) + si_dims (i) = si_dims (i-1); + si_dims (0) = si_len; + + MArrayN si (si_dims, T (0.0)); ! return filter (b, a, x, si, dim); } DEFUN_DLD (filter, args, nargout, "-*- texinfo -*-\n\ at deftypefn {Loadable Function} {y =} filter (@var{b}, @var{a}, @var{x})\n\ at deftypefnx {Loadable Function} {[@var{y}, @var{sf}] =} filter (@var{b}, @var{a}, @var{x}, @var{si})\n\ + at deftypefnx {Loadable Function} {[@var{y}, @var{sf}] =} filter (@var{b}, @var{a}, @var{x}, [], @var{dim})\n\ + at deftypefnx {Loadable Function} {[@var{y}, @var{sf}] =} filter (@var{b}, @var{a}, @var{x}, @var{si}, @var{dim})\n\ Return the solution to the following linear, time-invariant difference\n\ equation:\n\ at iftex\n\ *************** *** 194,200 **** $a \\in \\Re^{N-1}$, $b \\in \\Re^{M-1}$, and $x \\in \\Re^P$.\n\ at end tex\n\ at end iftex\n\ ! An equivalent form of this equation is:\n\ at iftex\n\ at tex\n\ $$\n\ --- 276,283 ---- $a \\in \\Re^{N-1}$, $b \\in \\Re^{M-1}$, and $x \\in \\Re^P$.\n\ at end tex\n\ at end iftex\n\ ! over the first non-singleton dimension of at var{x} or over @var{dim} if\n\ ! supplied. An equivalent form of this equation is:\n\ at iftex\n\ at tex\n\ $$\n\ *************** *** 259,317 **** int nargin = args.length (); ! if (nargin < 3 || nargin > 4) { print_usage ("filter"); return retval; } ! const char *errmsg = "filter: arguments must be vectors"; ! bool x_is_row_vector = (args(2).rows () == 1); ! bool si_is_row_vector = (nargin == 4 && args(3).rows () == 1); if (args(0).is_complex_type () || args(1).is_complex_type () || args(2).is_complex_type () ! || (nargin == 4 && args(3).is_complex_type ())) { ComplexColumnVector b (args(0).complex_vector_value ()); ComplexColumnVector a (args(1).complex_vector_value ()); ! ComplexColumnVector x (args(2).complex_vector_value ()); if (! error_state) { ! ComplexColumnVector si; ! if (nargin == 3) { int a_len = a.length (); int b_len = b.length (); int si_len = (a_len > b_len ? a_len : b_len) - 1; ! si.resize (si_len, 0.0); } else ! si = ComplexColumnVector (args(3).complex_vector_value ()); if (! error_state) { ! ComplexColumnVector y (filter (b, a, x, si)); if (nargout == 2) ! { ! if (si_is_row_vector) ! retval(1) = si.transpose (); ! else ! retval(1) = si; ! } ! if (x_is_row_vector) ! retval(0) = y.transpose (); ! else ! retval(0) = y; } else error (errmsg); --- 342,432 ---- int nargin = args.length (); ! if (nargin < 3 || nargin > 5) { print_usage ("filter"); return retval; } ! const char *errmsg = "filter: arguments a and b must be vectors"; ! int dim; ! dim_vector x_dims = args(2).dims (); ! if (nargin == 5) ! { ! dim = args(4).nint_value() - 1; ! if (dim < 0 || dim >= x_dims.length ()) ! { ! error ("filter: filtering over invalid dimension"); ! return retval; ! } ! } ! else ! { ! // Find first non-singleton dimension ! dim = 0; ! while ((dim < x_dims.length()) && (x_dims (dim) <= 1)) ! dim++; ! ! // All dimensions singleton, pick first dimension ! if (dim == x_dims.length ()) ! dim = 0; ! } if (args(0).is_complex_type () || args(1).is_complex_type () || args(2).is_complex_type () ! || (nargin >= 4 && args(3).is_complex_type ())) { ComplexColumnVector b (args(0).complex_vector_value ()); ComplexColumnVector a (args(1).complex_vector_value ()); ! ! ComplexNDArray x (args(2).complex_array_value ()); if (! error_state) { ! ComplexNDArray si; ! if (nargin == 3 || args(3).is_empty ()) { int a_len = a.length (); int b_len = b.length (); int si_len = (a_len > b_len ? a_len : b_len) - 1; ! dim_vector si_dims = x.dims (); ! for (int i = dim; i > 0; i--) ! si_dims (i) = si_dims (i-1); ! si_dims (0) = si_len; ! ! si.resize (si_dims, 0.0); } else ! { ! dim_vector si_dims = args (3).dims (); ! bool si_is_vector = true; ! for (int i=0; i < si_dims.length (); i++) ! if ((si_dims (i) != 1) && (si_dims (i) < si_dims.numel ())) ! { ! si_is_vector = false; ! break; ! } ! ! if (si_is_vector) ! si = ComplexNDArray (args(3).complex_vector_value ()); ! else ! si = args(3).complex_array_value (); ! } if (! error_state) { ! ComplexNDArray y (filter (b, a, x, si, dim)); if (nargout == 2) ! retval(1) = si; ! retval(0) = y; } else error (errmsg); *************** *** 323,362 **** { ColumnVector b (args(0).vector_value ()); ColumnVector a (args(1).vector_value ()); ! ColumnVector x (args(2).vector_value ()); if (! error_state) { ! ColumnVector si; ! if (nargin == 3) { int a_len = a.length (); int b_len = b.length (); int si_len = (a_len > b_len ? a_len : b_len) - 1; ! si.resize (si_len, 0.0); } else ! si = ColumnVector (args(3).vector_value ()); if (! error_state) { ! ColumnVector y (filter (b, a, x, si)); if (nargout == 2) ! { ! if (si_is_row_vector) ! retval(1) = si.transpose (); ! else ! retval(1) = si; ! } ! if (x_is_row_vector) ! retval(0) = y.transpose (); ! else ! retval(0) = y; } else error (errmsg); --- 438,489 ---- { ColumnVector b (args(0).vector_value ()); ColumnVector a (args(1).vector_value ()); ! ! NDArray x (args(2).array_value ()); if (! error_state) { ! NDArray si; ! if (nargin == 3 || args(3).is_empty ()) { int a_len = a.length (); int b_len = b.length (); int si_len = (a_len > b_len ? a_len : b_len) - 1; ! dim_vector si_dims = x.dims (); ! for (int i = dim; i > 0; i--) ! si_dims (i) = si_dims (i-1); ! si_dims (0) = si_len; ! ! si.resize (si_dims, 0.0); } else ! { ! dim_vector si_dims = args (3).dims (); ! bool si_is_vector = true; ! for (int i=0; i < si_dims.length (); i++) ! if ((si_dims (i) != 1) && (si_dims (i) < si_dims.numel ())) ! { ! si_is_vector = false; ! break; ! } ! ! if (si_is_vector) ! si = NDArray (args(3).vector_value ()); ! else ! si = args(3).array_value (); ! } if (! error_state) { ! NDArray y (filter (b, a, x, si, dim)); if (nargout == 2) ! retval(1) = si; ! retval(0) = y; } else error (errmsg); *************** *** 368,386 **** return retval; } ! template MArray ! filter (MArray&, MArray&, MArray&, ! MArray&); ! ! template MArray ! filter (MArray&, MArray&, MArray&); ! ! template MArray ! filter (MArray&, MArray&, MArray&, ! MArray&); ! template MArray ! filter (MArray&, MArray&, MArray &); /* ;;; Local Variables: *** --- 495,513 ---- return retval; } ! template MArrayN ! filter (MArray&, MArray&, MArrayN&, ! MArrayN&, int dim); ! ! template MArrayN ! filter (MArray&, MArray&, MArrayN&, int dim); ! ! template MArrayN ! filter (MArray&, MArray&, MArrayN&, ! MArrayN&, int dim); ! template MArrayN ! filter (MArray&, MArray&, MArrayN&, int dim); /* ;;; Local Variables: *** *** ./src/DLD-FUNCTIONS/minmax.cc.orig 2004-03-26 18:17:53.000000000 +0100 --- ./src/DLD-FUNCTIONS/minmax.cc 2004-03-27 01:37:06.000000000 +0100 *************** *** 28,35 **** #include "lo-ieee.h" #include "lo-mappers.h" ! #include "dMatrix.h" ! #include "CMatrix.h" #include "quit.h" #include "defun-dld.h" --- 28,35 ---- #include "lo-ieee.h" #include "lo-mappers.h" ! #include "dNDArray.h" ! #include "CNDArray.h" #include "quit.h" #include "defun-dld.h" *************** *** 37,49 **** #include "gripes.h" #include "oct-obj.h" #define MINMAX_BODY(FCN) \ \ octave_value_list retval; \ \ int nargin = args.length (); \ \ ! if (nargin < 1 || nargin > 2 || nargout > 2) \ { \ print_usage (#FCN); \ return retval; \ --- 37,51 ---- #include "gripes.h" #include "oct-obj.h" + #include "ov-cx-mat.h" + #define MINMAX_BODY(FCN) \ \ octave_value_list retval; \ \ int nargin = args.length (); \ \ ! if (nargin < 1 || nargin > 3 || nargout > 2) \ { \ print_usage (#FCN); \ return retval; \ *************** *** 51,59 **** --- 53,65 ---- \ octave_value arg1; \ octave_value arg2; \ + octave_value arg3; \ \ switch (nargin) \ { \ + case 3: \ + arg3 = args(2); \ + \ case 2: \ arg2 = args(1); \ \ *************** *** 66,162 **** break; \ } \ \ ! if (nargin == 1 && (nargout == 1 || nargout == 0)) \ { \ if (arg1.is_real_type ()) \ { \ ! Matrix m = arg1.matrix_value (); \ \ if (! error_state) \ { \ ! if (m.rows () == 1) \ ! retval(0) = m.row_ ## FCN (); \ ! else \ ! { \ ! if (m.rows () == 0 || m.columns () == 0) \ ! retval(0) = Matrix (); \ ! else \ ! retval(0) = m.column_ ## FCN (); \ ! } \ } \ } \ else if (arg1.is_complex_type ()) \ { \ ! ComplexMatrix m = arg1.complex_matrix_value (); \ \ if (! error_state) \ { \ ! if (m.rows () == 1) \ ! retval(0) = m.row_ ## FCN (); \ ! else \ ! { \ ! if (m.rows () == 0 || m.columns () == 0) \ ! retval(0) = Matrix (); \ ! else \ ! retval(0) = m.column_ ## FCN (); \ ! } \ } \ } \ else \ gripe_wrong_type_arg (#FCN, arg1); \ } \ ! else if (nargin == 1 && nargout == 2) \ { \ ! Array index; \ \ if (arg1.is_real_type ()) \ { \ ! Matrix m = arg1.matrix_value (); \ \ if (! error_state) \ { \ ! retval.resize (2); \ ! \ ! if (m.rows () == 1) \ ! retval(0) = m.row_ ## FCN (index); \ ! else \ ! { \ ! if (m.rows () == 0 || m.columns () == 0) \ ! retval(0) = Matrix (); \ ! else \ ! retval(0) = m.column_ ## FCN (index); \ ! } \ } \ } \ else if (arg1.is_complex_type ()) \ { \ ! ComplexMatrix m = arg1.complex_matrix_value (); \ \ if (! error_state) \ { \ ! retval.resize (2); \ ! \ ! if (m.rows () == 1) \ ! retval(0) = m.row_ ## FCN (index); \ ! else \ ! { \ ! if (m.rows () == 0 || m.columns () == 0) \ ! retval(0) = Matrix (); \ ! else \ ! retval(0) = m.column_ ## FCN (index); \ ! } \ } \ } \ else \ gripe_wrong_type_arg (#FCN, arg1); \ \ ! int len = index.length (); \ \ if (len > 0) \ { \ double nan_val = lo_ieee_nan_value (); \ \ ! RowVector idx (len); \ \ for (int i = 0; i < len; i++) \ { \ --- 72,182 ---- break; \ } \ \ ! int dim; \ ! dim_vector dv = ((const octave_complex_matrix&) arg1) .dims (); \ ! if (error_state) \ ! { \ ! gripe_wrong_type_arg (#FCN, arg1); \ ! return retval; \ ! } \ ! \ ! if (nargin == 3) \ ! { \ ! dim = arg3.nint_value () - 1; \ ! if (dim < 0 || dim >= dv.length ()) \ ! { \ ! error ("%s: invalid dimension", #FCN); \ ! return retval; \ ! } \ ! } \ ! else \ ! { \ ! dim = 0; \ ! while ((dim < dv.length ()) && (dv (dim) <= 1)) \ ! dim++; \ ! if (dim == dv.length ()) \ ! dim = 0; \ ! } \ ! \ ! bool single_arg = (nargin == 1) || arg2.is_empty(); \ ! \ ! if (single_arg) \ ! { \ ! dv(dim) = 1; \ ! int n_dims = dv.length (); \ ! for (int i = n_dims; i > 1; i--) \ ! { \ ! if (dv(i-1) == 1) \ ! n_dims--; \ ! else \ ! break; \ ! } \ ! dv.resize (n_dims); \ ! } \ ! \ ! if (single_arg && (nargout == 1 || nargout == 0)) \ { \ if (arg1.is_real_type ()) \ { \ ! NDArray m = arg1.array_value (); \ \ if (! error_state) \ { \ ! NDArray n = m. FCN (dim); \ ! n.resize (dv); \ ! retval(0) = n; \ } \ } \ else if (arg1.is_complex_type ()) \ { \ ! ComplexNDArray m = arg1.complex_array_value (); \ \ if (! error_state) \ { \ ! ComplexNDArray n = m. FCN (dim); \ ! n.resize (dv); \ ! retval(0) = n; \ } \ } \ else \ gripe_wrong_type_arg (#FCN, arg1); \ } \ ! else if (single_arg && nargout == 2) \ { \ ! ArrayN index; \ \ if (arg1.is_real_type ()) \ { \ ! NDArray m = arg1.array_value (); \ \ if (! error_state) \ { \ ! NDArray n = m. FCN (index, dim); \ ! n.resize (dv); \ ! retval(0) = n; \ } \ } \ else if (arg1.is_complex_type ()) \ { \ ! ComplexNDArray m = arg1.complex_array_value (); \ \ if (! error_state) \ { \ ! ComplexNDArray n = m. FCN (index, dim); \ ! n.resize (dv); \ ! retval(0) = n; \ } \ } \ else \ gripe_wrong_type_arg (#FCN, arg1); \ \ ! int len = index.numel (); \ \ if (len > 0) \ { \ double nan_val = lo_ieee_nan_value (); \ \ ! NDArray idx (index.dims ()); \ \ for (int i = 0; i < len; i++) \ { \ *************** *** 169,177 **** retval(1) = idx; \ } \ else \ ! retval(1) = Matrix (); \ } \ ! else if (nargin == 2) \ { \ int arg1_is_scalar = arg1.is_scalar_type (); \ int arg2_is_scalar = arg2.is_scalar_type (); \ --- 189,197 ---- retval(1) = idx; \ } \ else \ ! retval(1) = NDArray (); \ } \ ! else \ { \ int arg1_is_scalar = arg1.is_scalar_type (); \ int arg2_is_scalar = arg2.is_scalar_type (); \ *************** *** 184,193 **** if (arg1_is_complex || arg2_is_complex) \ { \ Complex c1 = arg1.complex_value (); \ ! ComplexMatrix m2 = arg2.complex_matrix_value (); \ if (! error_state) \ { \ ! ComplexMatrix result = FCN (c1, m2); \ if (! error_state) \ retval(0) = result; \ } \ --- 204,213 ---- if (arg1_is_complex || arg2_is_complex) \ { \ Complex c1 = arg1.complex_value (); \ ! ComplexNDArray m2 = arg2.complex_array_value (); \ if (! error_state) \ { \ ! ComplexNDArray result = FCN (c1, m2); \ if (! error_state) \ retval(0) = result; \ } \ *************** *** 195,205 **** else \ { \ double d1 = arg1.double_value (); \ ! Matrix m2 = arg2.matrix_value (); \ \ if (! error_state) \ { \ ! Matrix result = FCN (d1, m2); \ if (! error_state) \ retval(0) = result; \ } \ --- 215,225 ---- else \ { \ double d1 = arg1.double_value (); \ ! NDArray m2 = arg2.array_value (); \ \ if (! error_state) \ { \ ! NDArray result = FCN (d1, m2); \ if (! error_state) \ retval(0) = result; \ } \ *************** *** 209,232 **** { \ if (arg1_is_complex || arg2_is_complex) \ { \ ! ComplexMatrix m1 = arg1.complex_matrix_value (); \ \ if (! error_state) \ { \ Complex c2 = arg2.complex_value (); \ ! ComplexMatrix result = FCN (m1, c2); \ if (! error_state) \ retval(0) = result; \ } \ } \ else \ { \ ! Matrix m1 = arg1.matrix_value (); \ \ if (! error_state) \ { \ double d2 = arg2.double_value (); \ ! Matrix result = FCN (m1, d2); \ if (! error_state) \ retval(0) = result; \ } \ --- 229,252 ---- { \ if (arg1_is_complex || arg2_is_complex) \ { \ ! ComplexNDArray m1 = arg1.complex_array_value (); \ \ if (! error_state) \ { \ Complex c2 = arg2.complex_value (); \ ! ComplexNDArray result = FCN (m1, c2); \ if (! error_state) \ retval(0) = result; \ } \ } \ else \ { \ ! NDArray m1 = arg1.array_value (); \ \ if (! error_state) \ { \ double d2 = arg2.double_value (); \ ! NDArray result = FCN (m1, d2); \ if (! error_state) \ retval(0) = result; \ } \ *************** *** 236,250 **** { \ if (arg1_is_complex || arg2_is_complex) \ { \ ! ComplexMatrix m1 = arg1.complex_matrix_value (); \ \ if (! error_state) \ { \ ! ComplexMatrix m2 = arg2.complex_matrix_value (); \ \ if (! error_state) \ { \ ! ComplexMatrix result = FCN (m1, m2); \ if (! error_state) \ retval(0) = result; \ } \ --- 256,270 ---- { \ if (arg1_is_complex || arg2_is_complex) \ { \ ! ComplexNDArray m1 = arg1.complex_array_value (); \ \ if (! error_state) \ { \ ! ComplexNDArray m2 = arg2.complex_array_value (); \ \ if (! error_state) \ { \ ! ComplexNDArray result = FCN (m1, m2); \ if (! error_state) \ retval(0) = result; \ } \ *************** *** 252,266 **** } \ else \ { \ ! Matrix m1 = arg1.matrix_value (); \ \ if (! error_state) \ { \ ! Matrix m2 = arg2.matrix_value (); \ \ if (! error_state) \ { \ ! Matrix result = FCN (m1, m2); \ if (! error_state) \ retval(0) = result; \ } \ --- 272,286 ---- } \ else \ { \ ! NDArray m1 = arg1.array_value (); \ \ if (! error_state) \ { \ ! NDArray m2 = arg2.array_value (); \ \ if (! error_state) \ { \ ! NDArray result = FCN (m1, m2); \ if (! error_state) \ retval(0) = result; \ } \ *************** *** 268,288 **** } \ } \ } \ - else \ - panic_impossible (); \ \ return retval DEFUN_DLD (min, args, nargout, "-*- texinfo -*-\n\ ! at deftypefn {Mapping Function} {} min (@var{x}, @var{y})\n\ at deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} min (@var{x})\n\ at cindex Utility Functions\n\ For a vector argument, return the minimum value. For a matrix\n\ argument, return the minimum value from each column, as a row\n\ ! vector.\n\ ! For two matrices (or a matrix and scalar),\n\ ! return the pair-wise minimum.\n\ Thus,\n\ \n\ at example\n\ --- 288,305 ---- } \ } \ } \ \ return retval DEFUN_DLD (min, args, nargout, "-*- texinfo -*-\n\ ! at deftypefn {Mapping Function} {} min (@var{x}, @var{y}, @var{dim})\n\ at deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} min (@var{x})\n\ at cindex Utility Functions\n\ For a vector argument, return the minimum value. For a matrix\n\ argument, return the minimum value from each column, as a row\n\ ! vector, or over the dimension at var{dim} if defined. For two matrices\n\ ! (or a matrix and scalar), return the pair-wise minimum.\n\ Thus,\n\ \n\ at example\n\ *************** *** 323,336 **** DEFUN_DLD (max, args, nargout, "-*- texinfo -*-\n\ ! at deftypefn {Mapping Function} {} max (@var{x}, @var{y})\n\ at deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} max (@var{x})\n\ at cindex Utility Functions\n\ For a vector argument, return the maximum value. For a matrix\n\ argument, return the maximum value from each column, as a row\n\ ! vector.\n\ ! For two matrices (or a matrix and scalar),\n\ ! return the pair-wise maximum.\n\ Thus,\n\ \n\ at example\n\ --- 340,352 ---- DEFUN_DLD (max, args, nargout, "-*- texinfo -*-\n\ ! at deftypefn {Mapping Function} {} max (@var{x}, @var{y}, @var{dim})\n\ at deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} max (@var{x})\n\ at cindex Utility Functions\n\ For a vector argument, return the maximum value. For a matrix\n\ argument, return the maximum value from each column, as a row\n\ ! vector, or over the dimension at var{dim} if defined. For two matrices\n\ ! (or a matrix and scalar), return the pair-wise maximum.\n\ Thus,\n\ \n\ at example\n\ *** ./src/ChangeLog.orig 2004-03-26 15:55:00.000000000 +0100 --- ./src/ChangeLog 2004-03-27 01:50:31.000000000 +0100 *************** *** 1,3 **** --- 1,15 ---- + 2004-03-26 David Bateman + + * DLD-FUNCTIONS/minmax.cc: Convert for NDArray, better Matlab + compatibility. + + * DLD-FUNCTIONS/filter.cc: Convert for NDArray, better Matlab + compatibility. + + 2004-03-25 David Bateman + + * load-save.cc (Fload): Better handling of non existent files. + 2004-03-12 John W. Eaton * ov-cell.cc (octave_cell::save_hdf5): Handle empty cells. *** ./src/load-save.cc.orig 2004-02-20 22:16:54.000000000 +0100 --- ./src/load-save.cc 2004-03-25 13:10:12.000000000 +0100 *************** *** 306,311 **** --- 306,318 ---- { load_save_format retval = LS_UNKNOWN; + // If the file doesn't exist do nothing + std::ifstream file_exist (fname.c_str ()); + if (file_exist) + file_exist.close (); + else + return LS_UNKNOWN; + #ifdef HAVE_HDF5 // check this before we open the file if (H5Fis_hdf5 (fname.c_str ()) > 0) *************** *** 722,740 **** { i++; ! hdf5_ifstream hdf5_file (fname.c_str ()); ! ! if (hdf5_file.file_id >= 0) { ! retval = do_load (hdf5_file, orig_fname, force, format, ! flt_fmt, list_only, swap, verbose, ! argv, i, argc, nargout); ! hdf5_file.close (); } - else - error ("load: couldn't open input file `%s'", - orig_fname.c_str ()); } else #endif /* HAVE_HDF5 */ --- 729,754 ---- { i++; ! // If the file doesn't exist do nothing ! std::ifstream file (fname.c_str (), std::ios::in); ! if (file) { ! file.close (); ! ! hdf5_ifstream hdf5_file (fname.c_str ()); ! if (hdf5_file.file_id >= 0) ! { ! retval = do_load (hdf5_file, orig_fname, force, format, ! flt_fmt, list_only, swap, verbose, ! argv, i, argc, nargout); ! ! hdf5_file.close (); ! } ! else ! error ("load: couldn't open input file `%s'", ! orig_fname.c_str ()); } } else #endif /* HAVE_HDF5 */ --zYM0uCDKw75PZbzx Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=patch_small *** ./liboctave/CNDArray.cc.orig 2004-03-26 18:17:12.000000000 +0100 --- ./liboctave/CNDArray.cc 2004-03-26 20:42:05.000000000 +0100 *************** *** 683,688 **** --- 683,874 ---- return ::cat_ra(*this, ra_arg, dim, iidx, move); } + static const Complex Complex_NaN_result (octave_NaN, octave_NaN); + + ComplexNDArray + ComplexNDArray::max (int dim) const + { + ArrayN dummy_idx; + return max (dummy_idx, dim); + } + + ComplexNDArray + ComplexNDArray::max (ArrayN& idx_arg, int dim) const + { + dim_vector dv = dims (); + dim_vector dr = dims (); + + if (dv.numel () == 0 || dim > dv.length () || dim < 0) + return ComplexNDArray (); + + dr(dim) = 1; + + ComplexNDArray result (dr); + idx_arg.resize (dr); + + int x_stride = 1; + int x_len = dv(dim); + for (int i = 0; i < dim; i++) + x_stride *= dv(i); + + for (int i = 0; i < dr.numel (); i++) + { + int x_offset; + if (x_stride == 1) + x_offset = i * x_len; + else + { + int x_offset2 = 0; + x_offset = i; + while (x_offset >= x_stride) + { + x_offset -= x_stride; + x_offset2++; + } + x_offset += x_offset2 * x_stride * x_len; + } + + int idx_j; + + Complex tmp_max; + + double abs_max = octave_NaN; + + for (idx_j = 0; idx_j < x_len; idx_j++) + { + tmp_max = elem (idx_j * x_stride + x_offset); + + if (! octave_is_NaN_or_NA (tmp_max)) + { + abs_max = ::abs(tmp_max); + break; + } + } + + for (int j = idx_j+1; j < x_len; j++) + { + Complex tmp = elem (j * x_stride + x_offset); + + if (octave_is_NaN_or_NA (tmp)) + continue; + + double abs_tmp = ::abs (tmp); + + if (abs_tmp > abs_max) + { + idx_j = j; + tmp_max = tmp; + abs_max = abs_tmp; + } + } + + if (octave_is_NaN_or_NA (tmp_max)) + { + result.elem (i) = Complex_NaN_result; + idx_arg.elem (i) = 0; + } + else + { + result.elem (i) = tmp_max; + idx_arg.elem (i) = idx_j; + } + } + + return result; + } + + ComplexNDArray + ComplexNDArray::min (int dim) const + { + ArrayN dummy_idx; + return min (dummy_idx, dim); + } + + ComplexNDArray + ComplexNDArray::min (ArrayN& idx_arg, int dim) const + { + dim_vector dv = dims (); + dim_vector dr = dims (); + + if (dv.numel () == 0 || dim > dv.length () || dim < 0) + return ComplexNDArray (); + + dr(dim) = 1; + + ComplexNDArray result (dr); + idx_arg.resize (dr); + + int x_stride = 1; + int x_len = dv(dim); + for (int i = 0; i < dim; i++) + x_stride *= dv(i); + + for (int i = 0; i < dr.numel (); i++) + { + int x_offset; + if (x_stride == 1) + x_offset = i * x_len; + else + { + int x_offset2 = 0; + x_offset = i; + while (x_offset >= x_stride) + { + x_offset -= x_stride; + x_offset2++; + } + x_offset += x_offset2 * x_stride * x_len; + } + + int idx_j; + + Complex tmp_min; + + double abs_min = octave_NaN; + + for (idx_j = 0; idx_j < x_len; idx_j++) + { + tmp_min = elem (idx_j * x_stride + x_offset); + + if (! octave_is_NaN_or_NA (tmp_min)) + { + abs_min = ::abs(tmp_min); + break; + } + } + + for (int j = idx_j+1; j < x_len; j++) + { + Complex tmp = elem (j * x_stride + x_offset); + + if (octave_is_NaN_or_NA (tmp)) + continue; + + double abs_tmp = ::abs (tmp); + + if (abs_tmp < abs_min) + { + idx_j = j; + tmp_min = tmp; + abs_min = abs_tmp; + } + } + + if (octave_is_NaN_or_NA (tmp_min)) + { + result.elem (i) = Complex_NaN_result; + idx_arg.elem (i) = 0; + } + else + { + result.elem (i) = tmp_min; + idx_arg.elem (i) = idx_j; + } + } + + return result; + } + NDArray ComplexNDArray::abs (void) const { *************** *** 836,841 **** --- 1022,1162 ---- return is; } + // XXX FIXME XXX -- it would be nice to share code among the min/max + // functions below. + + #define EMPTY_RETURN_CHECK(T) \ + if (nel == 0) \ + return T (dv); + + ComplexNDArray + min (Complex c, const ComplexNDArray& m) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (ComplexNDArray); + + ComplexNDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmin (c, m (i)); + } + + return result; + } + + ComplexNDArray + min (const ComplexNDArray& m, Complex c) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (ComplexNDArray); + + ComplexNDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmin (c, m (i)); + } + + return result; + } + + ComplexNDArray + min (const ComplexNDArray& a, const ComplexNDArray& b) + { + dim_vector dv = a.dims (); + int nel = dv.numel (); + + if (dv != b.dims ()) + { + (*current_liboctave_error_handler) + ("two-arg min expecting args of same size"); + return ComplexNDArray (); + } + + EMPTY_RETURN_CHECK (ComplexNDArray); + + ComplexNDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmin (a (i), b (i)); + } + + return result; + } + + ComplexNDArray + max (Complex c, const ComplexNDArray& m) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (ComplexNDArray); + + ComplexNDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmax (c, m (i)); + } + + return result; + } + + ComplexNDArray + max (const ComplexNDArray& m, Complex c) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (ComplexNDArray); + + ComplexNDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmax (c, m (i)); + } + + return result; + } + + ComplexNDArray + max (const ComplexNDArray& a, const ComplexNDArray& b) + { + dim_vector dv = a.dims (); + int nel = dv.numel (); + + if (dv != b.dims ()) + { + (*current_liboctave_error_handler) + ("two-arg max expecting args of same size"); + return ComplexNDArray (); + } + + EMPTY_RETURN_CHECK (ComplexNDArray); + + ComplexNDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmax (a (i), b (i)); + } + + return result; + } + NDS_CMP_OPS(ComplexNDArray, real, Complex, real) NDS_BOOL_OPS(ComplexNDArray, Complex, 0.0) *** ./liboctave/CNDArray.h.orig 2004-03-26 18:17:23.000000000 +0100 --- ./liboctave/CNDArray.h 2004-03-26 18:26:50.000000000 +0100 *************** *** 89,94 **** --- 89,99 ---- ComplexNDArray sumsq (int dim = -1) const; int cat (const ComplexNDArray& ra_arg, int dim, int iidx, int move); + ComplexNDArray max (int dim = 0) const; + ComplexNDArray max (ArrayN& index, int dim = 0) const; + ComplexNDArray min (int dim = 0) const; + ComplexNDArray min (ArrayN& index, int dim = 0) const; + ComplexNDArray& insert (const NDArray& a, int r, int c); ComplexNDArray& insert (const ComplexNDArray& a, int r, int c); *************** *** 130,135 **** --- 135,148 ---- : MArrayN (d, dv) { } }; + extern ComplexNDArray min (const Complex& c, const ComplexNDArray& m); + extern ComplexNDArray min (const ComplexNDArray& m, const Complex& c); + extern ComplexNDArray min (const ComplexNDArray& a, const ComplexNDArray& b); + + extern ComplexNDArray max (const Complex& c, const ComplexNDArray& m); + extern ComplexNDArray max (const ComplexNDArray& m, const Complex& c); + extern ComplexNDArray max (const ComplexNDArray& a, const ComplexNDArray& b); + NDS_CMP_OP_DECLS (ComplexNDArray, Complex) NDS_BOOL_OP_DECLS (ComplexNDArray, Complex) *** ./liboctave/dNDArray.cc.orig 2004-03-26 18:17:33.000000000 +0100 --- ./liboctave/dNDArray.cc 2004-03-26 20:39:23.000000000 +0100 *************** *** 660,670 **** NDArray::max (int dim) const { ArrayN dummy_idx; ! return max (dim, dummy_idx); } NDArray ! NDArray::max (int dim, ArrayN& idx_arg) const { dim_vector dv = dims (); dim_vector dr = dims (); --- 660,670 ---- NDArray::max (int dim) const { ArrayN dummy_idx; ! return max (dummy_idx, dim); } NDArray ! NDArray::max (ArrayN& idx_arg, int dim) const { dim_vector dv = dims (); dim_vector dr = dims (); *************** *** 711,717 **** break; } ! for (int j = idx_j+1; j < nc; j++) { double tmp = elem (j * x_stride + x_offset); --- 711,717 ---- break; } ! for (int j = idx_j+1; j < x_len; j++) { double tmp = elem (j * x_stride + x_offset); *************** *** 731,736 **** --- 731,811 ---- return result; } + NDArray + NDArray::min (int dim) const + { + ArrayN dummy_idx; + return min (dummy_idx, dim); + } + + NDArray + NDArray::min (ArrayN& idx_arg, int dim) const + { + dim_vector dv = dims (); + dim_vector dr = dims (); + + if (dv.numel () == 0 || dim > dv.length () || dim < 0) + return NDArray (); + + dr(dim) = 1; + + NDArray result (dr); + idx_arg.resize (dr); + + int x_stride = 1; + int x_len = dv(dim); + for (int i = 0; i < dim; i++) + x_stride *= dv(i); + + for (int i = 0; i < dr.numel (); i++) + { + int x_offset; + if (x_stride == 1) + x_offset = i * x_len; + else + { + int x_offset2 = 0; + x_offset = i; + while (x_offset >= x_stride) + { + x_offset -= x_stride; + x_offset2++; + } + x_offset += x_offset2 * x_stride * x_len; + } + + int idx_j; + + double tmp_min = octave_NaN; + + for (idx_j = 0; idx_j < x_len; idx_j++) + { + tmp_min = elem (idx_j * x_stride + x_offset); + + if (! octave_is_NaN_or_NA (tmp_min)) + break; + } + + for (int j = idx_j+1; j < x_len; j++) + { + double tmp = elem (j * x_stride + x_offset); + + if (octave_is_NaN_or_NA (tmp)) + continue; + else if (tmp < tmp_min) + { + idx_j = j; + tmp_min = tmp; + } + } + + result.elem (i) = tmp_min; + idx_arg.elem (i) = octave_is_NaN_or_NA (tmp_min) ? 0 : idx_j; + } + + return result; + } + int NDArray::cat (const NDArray& ra_arg, int dim, int iidx, int move) { *************** *** 851,856 **** --- 926,1066 ---- return is; } + // XXX FIXME XXX -- it would be nice to share code among the min/max + // functions below. + + #define EMPTY_RETURN_CHECK(T) \ + if (nel == 0) \ + return T (dv); + + NDArray + min (double d, const NDArray& m) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (NDArray); + + NDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmin (d, m (i)); + } + + return result; + } + + NDArray + min (const NDArray& m, double d) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (NDArray); + + NDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmin (d, m (i)); + } + + return result; + } + + NDArray + min (const NDArray& a, const NDArray& b) + { + dim_vector dv = a.dims (); + int nel = dv.numel (); + + if (dv != b.dims ()) + { + (*current_liboctave_error_handler) + ("two-arg min expecting args of same size"); + return NDArray (); + } + + EMPTY_RETURN_CHECK (NDArray); + + NDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmin (a (i), b (i)); + } + + return result; + } + + NDArray + max (double d, const NDArray& m) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (NDArray); + + NDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmax (d, m (i)); + } + + return result; + } + + NDArray + max (const NDArray& m, double d) + { + dim_vector dv = m.dims (); + int nel = dv.numel (); + + EMPTY_RETURN_CHECK (NDArray); + + NDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmax (d, m (i)); + } + + return result; + } + + NDArray + max (const NDArray& a, const NDArray& b) + { + dim_vector dv = a.dims (); + int nel = dv.numel (); + + if (dv != b.dims ()) + { + (*current_liboctave_error_handler) + ("two-arg max expecting args of same size"); + return NDArray (); + } + + EMPTY_RETURN_CHECK (NDArray); + + NDArray result (dv); + + for (int i = 0; i < nel; i++) + { + OCTAVE_QUIT; + result (i) = xmax (a (i), b (i)); + } + + return result; + } + NDS_CMP_OPS(NDArray, , double, ) NDS_BOOL_OPS(NDArray, double, 0.0) *** ./liboctave/dNDArray.h.orig 2004-03-26 18:17:38.000000000 +0100 --- ./liboctave/dNDArray.h 2004-03-26 18:26:17.000000000 +0100 *************** *** 87,93 **** NDArray sum (int dim = -1) const; NDArray sumsq (int dim = -1) const; int cat (const NDArray& ra_arg, int dim, int iidx, int move); ! NDArray abs (void) const; ComplexNDArray fourier (int dim = 1) const; --- 87,98 ---- NDArray sum (int dim = -1) const; NDArray sumsq (int dim = -1) const; int cat (const NDArray& ra_arg, int dim, int iidx, int move); ! ! NDArray max (int dim = 0) const; ! NDArray max (ArrayN& index, int dim = 0) const; ! NDArray min (int dim = 0) const; ! NDArray min (ArrayN& index, int dim = 0) const; ! NDArray abs (void) const; ComplexNDArray fourier (int dim = 1) const; *************** *** 125,130 **** --- 130,143 ---- NDArray (double *d, const dim_vector& dv) : MArrayN (d, dv) { } }; + extern NDArray min (double d, const NDArray& m); + extern NDArray min (const NDArray& m, double d); + extern NDArray min (const NDArray& a, const NDArray& b); + + extern NDArray max (double d, const NDArray& m); + extern NDArray max (const NDArray& m, double d); + extern NDArray max (const NDArray& a, const NDArray& b); + NDS_CMP_OP_DECLS (NDArray, double) NDS_BOOL_OP_DECLS (NDArray, double) *** ./liboctave/ChangeLog.orig 2004-03-27 01:44:39.000000000 +0100 --- ./liboctave/ChangeLog 2004-03-27 01:44:43.000000000 +0100 *************** *** 1,3 **** --- 1,14 ---- + 2004-03-26 David Bateman + + * dNDArray.cc (NDArray::min, NDArray::max, min, max): + Min and Max functions for NDArrays. + * dNDArray.h (NDArray::min, NDArray::max, min, max): Decl. + + * CNDArray.cc (ComplexNDArray::min, ComplexNDArray::max, min, max): + Min and Max functions for ComplexNDArrays. + * CNDArray.h (ComplexNDArray::min, ComplexNDArray::max, min, max): + Decl. + 2004-03-11 John W. Eaton * so-array.cc (SND_CMP_OP, NDS_CMP_OP, NDND_CMP_OP): *** ./src/DLD-FUNCTIONS/minmax.cc.orig 2004-03-26 18:17:53.000000000 +0100 --- ./src/DLD-FUNCTIONS/minmax.cc 2004-03-27 01:37:06.000000000 +0100 *************** *** 28,35 **** #include "lo-ieee.h" #include "lo-mappers.h" ! #include "dMatrix.h" ! #include "CMatrix.h" #include "quit.h" #include "defun-dld.h" --- 28,35 ---- #include "lo-ieee.h" #include "lo-mappers.h" ! #include "dNDArray.h" ! #include "CNDArray.h" #include "quit.h" #include "defun-dld.h" *************** *** 37,49 **** #include "gripes.h" #include "oct-obj.h" #define MINMAX_BODY(FCN) \ \ octave_value_list retval; \ \ int nargin = args.length (); \ \ ! if (nargin < 1 || nargin > 2 || nargout > 2) \ { \ print_usage (#FCN); \ return retval; \ --- 37,51 ---- #include "gripes.h" #include "oct-obj.h" + #include "ov-cx-mat.h" + #define MINMAX_BODY(FCN) \ \ octave_value_list retval; \ \ int nargin = args.length (); \ \ ! if (nargin < 1 || nargin > 3 || nargout > 2) \ { \ print_usage (#FCN); \ return retval; \ *************** *** 51,59 **** --- 53,65 ---- \ octave_value arg1; \ octave_value arg2; \ + octave_value arg3; \ \ switch (nargin) \ { \ + case 3: \ + arg3 = args(2); \ + \ case 2: \ arg2 = args(1); \ \ *************** *** 66,162 **** break; \ } \ \ ! if (nargin == 1 && (nargout == 1 || nargout == 0)) \ { \ if (arg1.is_real_type ()) \ { \ ! Matrix m = arg1.matrix_value (); \ \ if (! error_state) \ { \ ! if (m.rows () == 1) \ ! retval(0) = m.row_ ## FCN (); \ ! else \ ! { \ ! if (m.rows () == 0 || m.columns () == 0) \ ! retval(0) = Matrix (); \ ! else \ ! retval(0) = m.column_ ## FCN (); \ ! } \ } \ } \ else if (arg1.is_complex_type ()) \ { \ ! ComplexMatrix m = arg1.complex_matrix_value (); \ \ if (! error_state) \ { \ ! if (m.rows () == 1) \ ! retval(0) = m.row_ ## FCN (); \ ! else \ ! { \ ! if (m.rows () == 0 || m.columns () == 0) \ ! retval(0) = Matrix (); \ ! else \ ! retval(0) = m.column_ ## FCN (); \ ! } \ } \ } \ else \ gripe_wrong_type_arg (#FCN, arg1); \ } \ ! else if (nargin == 1 && nargout == 2) \ { \ ! Array index; \ \ if (arg1.is_real_type ()) \ { \ ! Matrix m = arg1.matrix_value (); \ \ if (! error_state) \ { \ ! retval.resize (2); \ ! \ ! if (m.rows () == 1) \ ! retval(0) = m.row_ ## FCN (index); \ ! else \ ! { \ ! if (m.rows () == 0 || m.columns () == 0) \ ! retval(0) = Matrix (); \ ! else \ ! retval(0) = m.column_ ## FCN (index); \ ! } \ } \ } \ else if (arg1.is_complex_type ()) \ { \ ! ComplexMatrix m = arg1.complex_matrix_value (); \ \ if (! error_state) \ { \ ! retval.resize (2); \ ! \ ! if (m.rows () == 1) \ ! retval(0) = m.row_ ## FCN (index); \ ! else \ ! { \ ! if (m.rows () == 0 || m.columns () == 0) \ ! retval(0) = Matrix (); \ ! else \ ! retval(0) = m.column_ ## FCN (index); \ ! } \ } \ } \ else \ gripe_wrong_type_arg (#FCN, arg1); \ \ ! int len = index.length (); \ \ if (len > 0) \ { \ double nan_val = lo_ieee_nan_value (); \ \ ! RowVector idx (len); \ \ for (int i = 0; i < len; i++) \ { \ --- 72,182 ---- break; \ } \ \ ! int dim; \ ! dim_vector dv = ((const octave_complex_matrix&) arg1) .dims (); \ ! if (error_state) \ ! { \ ! gripe_wrong_type_arg (#FCN, arg1); \ ! return retval; \ ! } \ ! \ ! if (nargin == 3) \ ! { \ ! dim = arg3.nint_value () - 1; \ ! if (dim < 0 || dim >= dv.length ()) \ ! { \ ! error ("%s: invalid dimension", #FCN); \ ! return retval; \ ! } \ ! } \ ! else \ ! { \ ! dim = 0; \ ! while ((dim < dv.length ()) && (dv (dim) <= 1)) \ ! dim++; \ ! if (dim == dv.length ()) \ ! dim = 0; \ ! } \ ! \ ! bool single_arg = (nargin == 1) || arg2.is_empty(); \ ! \ ! if (single_arg) \ ! { \ ! dv(dim) = 1; \ ! int n_dims = dv.length (); \ ! for (int i = n_dims; i > 1; i--) \ ! { \ ! if (dv(i-1) == 1) \ ! n_dims--; \ ! else \ ! break; \ ! } \ ! dv.resize (n_dims); \ ! } \ ! \ ! if (single_arg && (nargout == 1 || nargout == 0)) \ { \ if (arg1.is_real_type ()) \ { \ ! NDArray m = arg1.array_value (); \ \ if (! error_state) \ { \ ! NDArray n = m. FCN (dim); \ ! n.resize (dv); \ ! retval(0) = n; \ } \ } \ else if (arg1.is_complex_type ()) \ { \ ! ComplexNDArray m = arg1.complex_array_value (); \ \ if (! error_state) \ { \ ! ComplexNDArray n = m. FCN (dim); \ ! n.resize (dv); \ ! retval(0) = n; \ } \ } \ else \ gripe_wrong_type_arg (#FCN, arg1); \ } \ ! else if (single_arg && nargout == 2) \ { \ ! ArrayN index; \ \ if (arg1.is_real_type ()) \ { \ ! NDArray m = arg1.array_value (); \ \ if (! error_state) \ { \ ! NDArray n = m. FCN (index, dim); \ ! n.resize (dv); \ ! retval(0) = n; \ } \ } \ else if (arg1.is_complex_type ()) \ { \ ! ComplexNDArray m = arg1.complex_array_value (); \ \ if (! error_state) \ { \ ! ComplexNDArray n = m. FCN (index, dim); \ ! n.resize (dv); \ ! retval(0) = n; \ } \ } \ else \ gripe_wrong_type_arg (#FCN, arg1); \ \ ! int len = index.numel (); \ \ if (len > 0) \ { \ double nan_val = lo_ieee_nan_value (); \ \ ! NDArray idx (index.dims ()); \ \ for (int i = 0; i < len; i++) \ { \ *************** *** 169,177 **** retval(1) = idx; \ } \ else \ ! retval(1) = Matrix (); \ } \ ! else if (nargin == 2) \ { \ int arg1_is_scalar = arg1.is_scalar_type (); \ int arg2_is_scalar = arg2.is_scalar_type (); \ --- 189,197 ---- retval(1) = idx; \ } \ else \ ! retval(1) = NDArray (); \ } \ ! else \ { \ int arg1_is_scalar = arg1.is_scalar_type (); \ int arg2_is_scalar = arg2.is_scalar_type (); \ *************** *** 184,193 **** if (arg1_is_complex || arg2_is_complex) \ { \ Complex c1 = arg1.complex_value (); \ ! ComplexMatrix m2 = arg2.complex_matrix_value (); \ if (! error_state) \ { \ ! ComplexMatrix result = FCN (c1, m2); \ if (! error_state) \ retval(0) = result; \ } \ --- 204,213 ---- if (arg1_is_complex || arg2_is_complex) \ { \ Complex c1 = arg1.complex_value (); \ ! ComplexNDArray m2 = arg2.complex_array_value (); \ if (! error_state) \ { \ ! ComplexNDArray result = FCN (c1, m2); \ if (! error_state) \ retval(0) = result; \ } \ *************** *** 195,205 **** else \ { \ double d1 = arg1.double_value (); \ ! Matrix m2 = arg2.matrix_value (); \ \ if (! error_state) \ { \ ! Matrix result = FCN (d1, m2); \ if (! error_state) \ retval(0) = result; \ } \ --- 215,225 ---- else \ { \ double d1 = arg1.double_value (); \ ! NDArray m2 = arg2.array_value (); \ \ if (! error_state) \ { \ ! NDArray result = FCN (d1, m2); \ if (! error_state) \ retval(0) = result; \ } \ *************** *** 209,232 **** { \ if (arg1_is_complex || arg2_is_complex) \ { \ ! ComplexMatrix m1 = arg1.complex_matrix_value (); \ \ if (! error_state) \ { \ Complex c2 = arg2.complex_value (); \ ! ComplexMatrix result = FCN (m1, c2); \ if (! error_state) \ retval(0) = result; \ } \ } \ else \ { \ ! Matrix m1 = arg1.matrix_value (); \ \ if (! error_state) \ { \ double d2 = arg2.double_value (); \ ! Matrix result = FCN (m1, d2); \ if (! error_state) \ retval(0) = result; \ } \ --- 229,252 ---- { \ if (arg1_is_complex || arg2_is_complex) \ { \ ! ComplexNDArray m1 = arg1.complex_array_value (); \ \ if (! error_state) \ { \ Complex c2 = arg2.complex_value (); \ ! ComplexNDArray result = FCN (m1, c2); \ if (! error_state) \ retval(0) = result; \ } \ } \ else \ { \ ! NDArray m1 = arg1.array_value (); \ \ if (! error_state) \ { \ double d2 = arg2.double_value (); \ ! NDArray result = FCN (m1, d2); \ if (! error_state) \ retval(0) = result; \ } \ *************** *** 236,250 **** { \ if (arg1_is_complex || arg2_is_complex) \ { \ ! ComplexMatrix m1 = arg1.complex_matrix_value (); \ \ if (! error_state) \ { \ ! ComplexMatrix m2 = arg2.complex_matrix_value (); \ \ if (! error_state) \ { \ ! ComplexMatrix result = FCN (m1, m2); \ if (! error_state) \ retval(0) = result; \ } \ --- 256,270 ---- { \ if (arg1_is_complex || arg2_is_complex) \ { \ ! ComplexNDArray m1 = arg1.complex_array_value (); \ \ if (! error_state) \ { \ ! ComplexNDArray m2 = arg2.complex_array_value (); \ \ if (! error_state) \ { \ ! ComplexNDArray result = FCN (m1, m2); \ if (! error_state) \ retval(0) = result; \ } \ *************** *** 252,266 **** } \ else \ { \ ! Matrix m1 = arg1.matrix_value (); \ \ if (! error_state) \ { \ ! Matrix m2 = arg2.matrix_value (); \ \ if (! error_state) \ { \ ! Matrix result = FCN (m1, m2); \ if (! error_state) \ retval(0) = result; \ } \ --- 272,286 ---- } \ else \ { \ ! NDArray m1 = arg1.array_value (); \ \ if (! error_state) \ { \ ! NDArray m2 = arg2.array_value (); \ \ if (! error_state) \ { \ ! NDArray result = FCN (m1, m2); \ if (! error_state) \ retval(0) = result; \ } \ *************** *** 268,288 **** } \ } \ } \ - else \ - panic_impossible (); \ \ return retval DEFUN_DLD (min, args, nargout, "-*- texinfo -*-\n\ ! at deftypefn {Mapping Function} {} min (@var{x}, @var{y})\n\ at deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} min (@var{x})\n\ at cindex Utility Functions\n\ For a vector argument, return the minimum value. For a matrix\n\ argument, return the minimum value from each column, as a row\n\ ! vector.\n\ ! For two matrices (or a matrix and scalar),\n\ ! return the pair-wise minimum.\n\ Thus,\n\ \n\ at example\n\ --- 288,305 ---- } \ } \ } \ \ return retval DEFUN_DLD (min, args, nargout, "-*- texinfo -*-\n\ ! at deftypefn {Mapping Function} {} min (@var{x}, @var{y}, @var{dim})\n\ at deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} min (@var{x})\n\ at cindex Utility Functions\n\ For a vector argument, return the minimum value. For a matrix\n\ argument, return the minimum value from each column, as a row\n\ ! vector, or over the dimension at var{dim} if defined. For two matrices\n\ ! (or a matrix and scalar), return the pair-wise minimum.\n\ Thus,\n\ \n\ at example\n\ *************** *** 323,336 **** DEFUN_DLD (max, args, nargout, "-*- texinfo -*-\n\ ! at deftypefn {Mapping Function} {} max (@var{x}, @var{y})\n\ at deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} max (@var{x})\n\ at cindex Utility Functions\n\ For a vector argument, return the maximum value. For a matrix\n\ argument, return the maximum value from each column, as a row\n\ ! vector.\n\ ! For two matrices (or a matrix and scalar),\n\ ! return the pair-wise maximum.\n\ Thus,\n\ \n\ at example\n\ --- 340,352 ---- DEFUN_DLD (max, args, nargout, "-*- texinfo -*-\n\ ! at deftypefn {Mapping Function} {} max (@var{x}, @var{y}, @var{dim})\n\ at deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} max (@var{x})\n\ at cindex Utility Functions\n\ For a vector argument, return the maximum value. For a matrix\n\ argument, return the maximum value from each column, as a row\n\ ! vector, or over the dimension at var{dim} if defined. For two matrices\n\ ! (or a matrix and scalar), return the pair-wise maximum.\n\ Thus,\n\ \n\ at example\n\ --zYM0uCDKw75PZbzx--