Mercurial > hg > octave-nkf
changeset 3747:50f30e40abca
[project @ 2000-12-07 05:47:06 by jwe]
author | jwe |
---|---|
date | Thu, 07 Dec 2000 05:47:07 +0000 |
parents | c82ab37998aa |
children | 599fb10b454d |
files | src/ChangeLog src/DLD-FUNCTIONS/dassl.cc src/DLD-FUNCTIONS/fsolve.cc src/DLD-FUNCTIONS/lsode.cc src/DLD-FUNCTIONS/minmax.cc src/DLD-FUNCTIONS/quad.cc src/help.cc |
diffstat | 7 files changed, 299 insertions(+), 427 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,26 @@ +2000-12-06 John W. Eaton <jwe@bevo.che.wisc.edu> + + * DLD-FUNCTIONS/minmax.cc (EMPTY_RETURN_CHECK): New macro. + (min, max): Use it. + + * DLD-FUNCTIONS/minmax.cc (MINMAX_BODY): New macro. If single arg + is empty, return empty matrix result and empty matrix for index. + (Fmin, Fmax): Use MINMAX_BODY, so we have consistent definition + for min and max functions. + +2000-11-30 Joerg Specht <joerg.specht@ins.uni-stuttgart.de> + + * help.cc (display_help_text): Append new line at end of doc string. + +2000-11-30 John W. Eaton <jwe@bevo.che.wisc.edu> + + * DLD-FUNCTIONS/lsode.cc (LSODE_ABORT1, LSODE_ABORT2): Omit `##' + in macro definition since they are not needed to paste strings + together and picky compilers choke on them. + * DLD-FUNCTIONS/quad.cc (QUAD_ABORT1, QUAD_ABORT2): Likewise. + * DLD-FUNCTIONS/fsolve.cc (FSOLVE_ABORT1, FSOLVE_ABORT2): Likewise. + * DLD-FUNCTIONS/dassl.cc (DASSL_ABORT1, DASSL_ABORT2): Likewise. + 2000-11-29 John W. Eaton <jwe@bevo.che.wisc.edu> * mkbuiltins (XDEFUNX_INTERNAL): New macro.
--- a/src/DLD-FUNCTIONS/dassl.cc +++ b/src/DLD-FUNCTIONS/dassl.cc @@ -120,7 +120,7 @@ #define DASSL_ABORT1(msg) \ do \ { \ - ::error ("dassl: " ## msg); \ + ::error ("dassl: " msg); \ DASSL_ABORT (); \ } \ while (0) @@ -128,7 +128,7 @@ #define DASSL_ABORT2(fmt, arg) \ do \ { \ - ::error ("dassl: " ## fmt, arg); \ + ::error ("dassl: " fmt, arg); \ DASSL_ABORT (); \ } \ while (0)
--- a/src/DLD-FUNCTIONS/fsolve.cc +++ b/src/DLD-FUNCTIONS/fsolve.cc @@ -136,7 +136,7 @@ #define FSOLVE_ABORT1(msg) \ do \ { \ - ::error ("fsolve: " ## msg); \ + ::error ("fsolve: " msg); \ FSOLVE_ABORT (); \ } \ while (0) @@ -144,7 +144,7 @@ #define FSOLVE_ABORT2(fmt, arg) \ do \ { \ - ::error ("fsolve: " ## fmt, arg); \ + ::error ("fsolve: " fmt, arg); \ FSOLVE_ABORT (); \ } \ while (0)
--- a/src/DLD-FUNCTIONS/lsode.cc +++ b/src/DLD-FUNCTIONS/lsode.cc @@ -144,7 +144,7 @@ #define LSODE_ABORT1(msg) \ do \ { \ - ::error ("lsode: " ## msg); \ + ::error ("lsode: " msg); \ LSODE_ABORT (); \ } \ while (0) @@ -152,7 +152,7 @@ #define LSODE_ABORT2(fmt, arg) \ do \ { \ - ::error ("lsode: " ## fmt, arg); \ + ::error ("lsode: " fmt, arg); \ LSODE_ABORT (); \ } \ while (0)
--- a/src/DLD-FUNCTIONS/minmax.cc +++ b/src/DLD-FUNCTIONS/minmax.cc @@ -37,12 +37,18 @@ // XXX FIXME XXX -- it would be nice to share code among the min/max // functions below. +#define EMPTY_RETURN_CHECK(T) \ + if (nr == 0 || nc == 0) \ + return T (0, 0) + static Matrix min (double d, const Matrix& m) { int nr = m.rows (); int nc = m.columns (); + EMPTY_RETURN_CHECK (Matrix); + Matrix result (nr, nc); for (int j = 0; j < nc; j++) @@ -58,6 +64,8 @@ int nr = m.rows (); int nc = m.columns (); + EMPTY_RETURN_CHECK (Matrix); + Matrix result (nr, nc); for (int j = 0; j < nc; j++) @@ -73,6 +81,8 @@ int nr = m.rows (); int nc = m.columns (); + EMPTY_RETURN_CHECK (ComplexMatrix); + ComplexMatrix result (nr, nc); for (int j = 0; j < nc; j++) @@ -88,6 +98,8 @@ int nr = m.rows (); int nc = m.columns (); + EMPTY_RETURN_CHECK (ComplexMatrix); + ComplexMatrix result (nr, nc); for (int j = 0; j < nc; j++) @@ -102,12 +114,15 @@ { int nr = a.rows (); int nc = a.columns (); + if (nr != b.rows () || nc != b.columns ()) { error ("two-arg min expecting args of same size"); return Matrix (); } + EMPTY_RETURN_CHECK (Matrix); + Matrix result (nr, nc); for (int j = 0; j < nc; j++) @@ -122,12 +137,15 @@ { int nr = a.rows (); int nc = a.columns (); + if (nr != b.rows () || nc != b.columns ()) { error ("two-arg min expecting args of same size"); return ComplexMatrix (); } + EMPTY_RETURN_CHECK (ComplexMatrix); + ComplexMatrix result (nr, nc); for (int j = 0; j < nc; j++) @@ -161,6 +179,8 @@ int nr = m.rows (); int nc = m.columns (); + EMPTY_RETURN_CHECK (Matrix); + Matrix result (nr, nc); for (int j = 0; j < nc; j++) @@ -176,6 +196,8 @@ int nr = m.rows (); int nc = m.columns (); + EMPTY_RETURN_CHECK (Matrix); + Matrix result (nr, nc); for (int j = 0; j < nc; j++) @@ -191,6 +213,8 @@ int nr = m.rows (); int nc = m.columns (); + EMPTY_RETURN_CHECK (ComplexMatrix); + ComplexMatrix result (nr, nc); for (int j = 0; j < nc; j++) @@ -206,6 +230,8 @@ int nr = m.rows (); int nc = m.columns (); + EMPTY_RETURN_CHECK (ComplexMatrix); + ComplexMatrix result (nr, nc); for (int j = 0; j < nc; j++) @@ -220,12 +246,15 @@ { int nr = a.rows (); int nc = a.columns (); + if (nr != b.rows () || nc != b.columns ()) { error ("two-arg max expecting args of same size"); return Matrix (); } + EMPTY_RETURN_CHECK (Matrix); + Matrix result (nr, nc); for (int j = 0; j < nc; j++) @@ -240,12 +269,15 @@ { int nr = a.rows (); int nc = a.columns (); + if (nr != b.rows () || nc != b.columns ()) { error ("two-arg max expecting args of same size"); return ComplexMatrix (); } + EMPTY_RETURN_CHECK (ComplexMatrix); + ComplexMatrix result (nr, nc); for (int j = 0; j < nc; j++) @@ -273,6 +305,239 @@ return result; } +#define MINMAX_BODY(FCN) \ + \ + octave_value_list retval; \ + \ + int nargin = args.length (); \ + \ + if (nargin < 1 || nargin > 2 || nargout > 2) \ + { \ + print_usage (#FCN); \ + return retval; \ + } \ + \ + octave_value arg1; \ + octave_value arg2; \ + \ + switch (nargin) \ + { \ + case 2: \ + arg2 = args(1); \ + \ + case 1: \ + arg1 = args(0); \ + break; \ + \ + default: \ + panic_impossible (); \ + 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<int> 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) \ + { \ + RowVector idx (len); \ + \ + for (int i = 0; i < len; i++) \ + { \ + int tmp = index.elem (i) + 1; \ + idx.elem (i) = (tmp <= 0) \ + ? octave_NaN : static_cast<double> (tmp); \ + } \ + \ + 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 (); \ + \ + int arg1_is_complex = arg1.is_complex_type (); \ + int arg2_is_complex = arg2.is_complex_type (); \ + \ + if (arg1_is_scalar) \ + { \ + 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; \ + } \ + } \ + 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; \ + } \ + } \ + } \ + else if (arg2_is_scalar) \ + { \ + 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; \ + } \ + } \ + } \ + else \ + { \ + 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; \ + } \ + } \ + } \ + 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; \ + } \ + } \ + } \ + } \ + } \ + else \ + panic_impossible (); \ + \ + return retval + DEFUN_DLD (min, args, nargout, "-*- texinfo -*-\n\ For a vector argument, return the minimum value. For a matrix\n\ @@ -298,215 +563,7 @@ @noindent\n\ returns @var{x} = 0 and @var{ix} = 3.") { - octave_value_list retval; - - int nargin = args.length (); - - if (nargin < 1 || nargin > 2 || nargout > 2) - { - print_usage ("min"); - return retval; - } - - octave_value arg1; - octave_value arg2; - - switch (nargin) - { - case 2: - arg2 = args(1); - // Fall through... - - case 1: - arg1 = args(0); - break; - - default: - panic_impossible (); - 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_min (); - else - retval(0) = m.column_min (); - } - } - else if (arg1.is_complex_type ()) - { - ComplexMatrix m = arg1.complex_matrix_value (); - - if (! error_state) - { - if (m.rows () == 1) - retval(0) = m.row_min (); - else - retval(0) = m.column_min (); - } - } - else - gripe_wrong_type_arg ("min", arg1); - } - else if (nargin == 1 && nargout == 2) - { - Array<int> 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_min (index); - else - retval(0) = m.column_min (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_min (index); - else - retval(0) = m.column_min (index); - } - } - else - gripe_wrong_type_arg ("min", arg1); - - int len = index.length (); - - if (len > 0) - { - RowVector idx (len); - - for (int i = 0; i < len; i++) - { - int tmp = index.elem (i) + 1; - idx.elem (i) = (tmp <= 0) - ? octave_NaN : static_cast<double> (tmp); - } - - retval(1) = idx; - } - } - else if (nargin == 2) - { - int arg1_is_scalar = arg1.is_scalar_type (); - int arg2_is_scalar = arg2.is_scalar_type (); - - int arg1_is_complex = arg1.is_complex_type (); - int arg2_is_complex = arg2.is_complex_type (); - - if (arg1_is_scalar) - { - if (arg1_is_complex || arg2_is_complex) - { - Complex c1 = arg1.complex_value (); - ComplexMatrix m2 = arg2.complex_matrix_value (); - if (! error_state) - { - ComplexMatrix result = min (c1, m2); - if (! error_state) - retval(0) = result; - } - } - else - { - double d1 = arg1.double_value (); - Matrix m2 = arg2.matrix_value (); - - if (! error_state) - { - Matrix result = min (d1, m2); - if (! error_state) - retval(0) = result; - } - } - } - else if (arg2_is_scalar) - { - if (arg1_is_complex || arg2_is_complex) - { - ComplexMatrix m1 = arg1.complex_matrix_value (); - - if (! error_state) - { - Complex c2 = arg2.complex_value (); - ComplexMatrix result = min (m1, c2); - if (! error_state) - retval(0) = result; - } - } - else - { - Matrix m1 = arg1.matrix_value (); - - if (! error_state) - { - double d2 = arg2.double_value (); - Matrix result = min (m1, d2); - if (! error_state) - retval(0) = result; - } - } - } - else - { - 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 = min (m1, m2); - if (! error_state) - retval(0) = result; - } - } - } - else - { - Matrix m1 = arg1.matrix_value (); - - if (! error_state) - { - Matrix m2 = arg2.matrix_value (); - - if (! error_state) - { - Matrix result = min (m1, m2); - if (! error_state) - retval(0) = result; - } - } - } - } - } - else - panic_impossible (); - - return retval; + MINMAX_BODY (min); } DEFUN_DLD (max, args, nargout, @@ -534,215 +591,7 @@ @noindent\n\ returns @var{x} = 5 and @var{ix} = 3.") { - octave_value_list retval; - - int nargin = args.length (); - - if (nargin < 1 || nargin > 2 || nargout > 2) - { - print_usage ("max"); - return retval; - } - - octave_value arg1; - octave_value arg2; - - switch (nargin) - { - case 2: - arg2 = args(1); - // Fall through... - - case 1: - arg1 = args(0); - break; - - default: - panic_impossible (); - 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_max (); - else - retval(0) = m.column_max (); - } - } - else if (arg1.is_complex_type ()) - { - ComplexMatrix m = arg1.complex_matrix_value (); - - if (! error_state) - { - if (m.rows () == 1) - retval(0) = m.row_max (); - else - retval(0) = m.column_max (); - } - } - else - gripe_wrong_type_arg ("max", arg1); - } - else if (nargin == 1 && nargout == 2) - { - Array<int> 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_max (index); - else - retval(0) = m.column_max (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_max (index); - else - retval(0) = m.column_max (index); - } - } - else - gripe_wrong_type_arg ("max", arg1); - - int len = index.length (); - - if (len > 0) - { - RowVector idx (len); - - for (int i = 0; i < len; i++) - { - int tmp = index.elem (i) + 1; - idx.elem (i) = (tmp <= 0) - ? octave_NaN : static_cast<double> (tmp); - } - - retval(1) = idx; - } - } - else if (nargin == 2) - { - int arg1_is_scalar = arg1.is_scalar_type (); - int arg2_is_scalar = arg2.is_scalar_type (); - - int arg1_is_complex = arg1.is_complex_type (); - int arg2_is_complex = arg2.is_complex_type (); - - if (arg1_is_scalar) - { - if (arg1_is_complex || arg2_is_complex) - { - Complex c1 = arg1.complex_value (); - ComplexMatrix m2 = arg2.complex_matrix_value (); - if (! error_state) - { - ComplexMatrix result = max (c1, m2); - if (! error_state) - retval(0) = result; - } - } - else - { - double d1 = arg1.double_value (); - Matrix m2 = arg2.matrix_value (); - - if (! error_state) - { - Matrix result = max (d1, m2); - if (! error_state) - retval(0) = result; - } - } - } - else if (arg2_is_scalar) - { - if (arg1_is_complex || arg2_is_complex) - { - ComplexMatrix m1 = arg1.complex_matrix_value (); - - if (! error_state) - { - Complex c2 = arg2.complex_value (); - ComplexMatrix result = max (m1, c2); - if (! error_state) - retval(0) = result; - } - } - else - { - Matrix m1 = arg1.matrix_value (); - - if (! error_state) - { - double d2 = arg2.double_value (); - Matrix result = max (m1, d2); - if (! error_state) - retval(0) = result; - } - } - } - else - { - 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 = max (m1, m2); - if (! error_state) - retval(0) = result; - } - } - } - else - { - Matrix m1 = arg1.matrix_value (); - - if (! error_state) - { - Matrix m2 = arg2.matrix_value (); - - if (! error_state) - { - Matrix result = max (m1, m2); - if (! error_state) - retval(0) = result; - } - } - } - } - } - else - panic_impossible (); - - return retval; + MINMAX_BODY (max); } /*
--- a/src/DLD-FUNCTIONS/quad.cc +++ b/src/DLD-FUNCTIONS/quad.cc @@ -104,7 +104,7 @@ #define QUAD_ABORT1(msg) \ do \ { \ - ::error ("quad: " ## msg); \ + ::error ("quad: " msg); \ QUAD_ABORT (); \ } \ while (0) @@ -112,7 +112,7 @@ #define QUAD_ABORT2(fmt, arg) \ do \ { \ - ::error ("quad: " ## fmt, arg); \ + ::error ("quad: " fmt, arg); \ QUAD_ABORT (); \ } \ while (0)