comparison src/DLD-FUNCTIONS/minmax.cc @ 4844:9f7ef92b50b0

[project @ 2004-04-02 17:26:53 by jwe]
author jwe
date Fri, 02 Apr 2004 17:26:54 +0000
parents abdcb14e598d
children b92d59213e63
comparison
equal deleted inserted replaced
4843:7b4e76100964 4844:9f7ef92b50b0
26 26
27 #include <cmath> 27 #include <cmath>
28 28
29 #include "lo-ieee.h" 29 #include "lo-ieee.h"
30 #include "lo-mappers.h" 30 #include "lo-mappers.h"
31 #include "dMatrix.h" 31 #include "dNDArray.h"
32 #include "CMatrix.h" 32 #include "CNDArray.h"
33 #include "quit.h" 33 #include "quit.h"
34 34
35 #include "defun-dld.h" 35 #include "defun-dld.h"
36 #include "error.h" 36 #include "error.h"
37 #include "gripes.h" 37 #include "gripes.h"
38 #include "oct-obj.h" 38 #include "oct-obj.h"
39 39
40 #include "ov-cx-mat.h"
41
40 #define MINMAX_BODY(FCN) \ 42 #define MINMAX_BODY(FCN) \
41 \ 43 \
42 octave_value_list retval; \ 44 octave_value_list retval; \
43 \ 45 \
44 int nargin = args.length (); \ 46 int nargin = args.length (); \
45 \ 47 \
46 if (nargin < 1 || nargin > 2 || nargout > 2) \ 48 if (nargin < 1 || nargin > 3 || nargout > 2) \
47 { \ 49 { \
48 print_usage (#FCN); \ 50 print_usage (#FCN); \
49 return retval; \ 51 return retval; \
50 } \ 52 } \
51 \ 53 \
52 octave_value arg1; \ 54 octave_value arg1; \
53 octave_value arg2; \ 55 octave_value arg2; \
56 octave_value arg3; \
54 \ 57 \
55 switch (nargin) \ 58 switch (nargin) \
56 { \ 59 { \
60 case 3: \
61 arg3 = args(2); \
62 \
57 case 2: \ 63 case 2: \
58 arg2 = args(1); \ 64 arg2 = args(1); \
59 \ 65 \
60 case 1: \ 66 case 1: \
61 arg1 = args(0); \ 67 arg1 = args(0); \
64 default: \ 70 default: \
65 panic_impossible (); \ 71 panic_impossible (); \
66 break; \ 72 break; \
67 } \ 73 } \
68 \ 74 \
69 if (nargin == 1 && (nargout == 1 || nargout == 0)) \ 75 int dim; \
76 dim_vector dv = ((const octave_complex_matrix&) arg1) .dims (); \
77 if (error_state) \
78 { \
79 gripe_wrong_type_arg (#FCN, arg1); \
80 return retval; \
81 } \
82 \
83 if (nargin == 3) \
84 { \
85 dim = arg3.nint_value () - 1; \
86 if (dim < 0 || dim >= dv.length ()) \
87 { \
88 error ("%s: invalid dimension", #FCN); \
89 return retval; \
90 } \
91 } \
92 else \
93 { \
94 dim = 0; \
95 while ((dim < dv.length ()) && (dv (dim) <= 1)) \
96 dim++; \
97 if (dim == dv.length ()) \
98 dim = 0; \
99 } \
100 \
101 bool single_arg = (nargin == 1) || arg2.is_empty(); \
102 \
103 if (single_arg) \
104 { \
105 dv(dim) = 1; \
106 int n_dims = dv.length (); \
107 for (int i = n_dims; i > 1; i--) \
108 { \
109 if (dv(i-1) == 1) \
110 n_dims--; \
111 else \
112 break; \
113 } \
114 dv.resize (n_dims); \
115 } \
116 \
117 if (single_arg && (nargout == 1 || nargout == 0)) \
70 { \ 118 { \
71 if (arg1.is_real_type ()) \ 119 if (arg1.is_real_type ()) \
72 { \ 120 { \
73 Matrix m = arg1.matrix_value (); \ 121 NDArray m = arg1.array_value (); \
74 \ 122 \
75 if (! error_state) \ 123 if (! error_state) \
76 { \ 124 { \
77 if (m.rows () == 1) \ 125 NDArray n = m. FCN (dim); \
78 retval(0) = m.row_ ## FCN (); \ 126 n.resize (dv); \
79 else \ 127 retval(0) = n; \
80 { \
81 if (m.rows () == 0 || m.columns () == 0) \
82 retval(0) = Matrix (); \
83 else \
84 retval(0) = m.column_ ## FCN (); \
85 } \
86 } \ 128 } \
87 } \ 129 } \
88 else if (arg1.is_complex_type ()) \ 130 else if (arg1.is_complex_type ()) \
89 { \ 131 { \
90 ComplexMatrix m = arg1.complex_matrix_value (); \ 132 ComplexNDArray m = arg1.complex_array_value (); \
91 \ 133 \
92 if (! error_state) \ 134 if (! error_state) \
93 { \ 135 { \
94 if (m.rows () == 1) \ 136 ComplexNDArray n = m. FCN (dim); \
95 retval(0) = m.row_ ## FCN (); \ 137 n.resize (dv); \
96 else \ 138 retval(0) = n; \
97 { \
98 if (m.rows () == 0 || m.columns () == 0) \
99 retval(0) = Matrix (); \
100 else \
101 retval(0) = m.column_ ## FCN (); \
102 } \
103 } \ 139 } \
104 } \ 140 } \
105 else \ 141 else \
106 gripe_wrong_type_arg (#FCN, arg1); \ 142 gripe_wrong_type_arg (#FCN, arg1); \
107 } \ 143 } \
108 else if (nargin == 1 && nargout == 2) \ 144 else if (single_arg && nargout == 2) \
109 { \ 145 { \
110 Array<int> index; \ 146 ArrayN<int> index; \
111 \ 147 \
112 if (arg1.is_real_type ()) \ 148 if (arg1.is_real_type ()) \
113 { \ 149 { \
114 Matrix m = arg1.matrix_value (); \ 150 NDArray m = arg1.array_value (); \
115 \ 151 \
116 if (! error_state) \ 152 if (! error_state) \
117 { \ 153 { \
118 retval.resize (2); \ 154 NDArray n = m. FCN (index, dim); \
119 \ 155 n.resize (dv); \
120 if (m.rows () == 1) \ 156 retval(0) = n; \
121 retval(0) = m.row_ ## FCN (index); \
122 else \
123 { \
124 if (m.rows () == 0 || m.columns () == 0) \
125 retval(0) = Matrix (); \
126 else \
127 retval(0) = m.column_ ## FCN (index); \
128 } \
129 } \ 157 } \
130 } \ 158 } \
131 else if (arg1.is_complex_type ()) \ 159 else if (arg1.is_complex_type ()) \
132 { \ 160 { \
133 ComplexMatrix m = arg1.complex_matrix_value (); \ 161 ComplexNDArray m = arg1.complex_array_value (); \
134 \ 162 \
135 if (! error_state) \ 163 if (! error_state) \
136 { \ 164 { \
137 retval.resize (2); \ 165 ComplexNDArray n = m. FCN (index, dim); \
138 \ 166 n.resize (dv); \
139 if (m.rows () == 1) \ 167 retval(0) = n; \
140 retval(0) = m.row_ ## FCN (index); \
141 else \
142 { \
143 if (m.rows () == 0 || m.columns () == 0) \
144 retval(0) = Matrix (); \
145 else \
146 retval(0) = m.column_ ## FCN (index); \
147 } \
148 } \ 168 } \
149 } \ 169 } \
150 else \ 170 else \
151 gripe_wrong_type_arg (#FCN, arg1); \ 171 gripe_wrong_type_arg (#FCN, arg1); \
152 \ 172 \
153 int len = index.length (); \ 173 int len = index.numel (); \
154 \ 174 \
155 if (len > 0) \ 175 if (len > 0) \
156 { \ 176 { \
157 double nan_val = lo_ieee_nan_value (); \ 177 double nan_val = lo_ieee_nan_value (); \
158 \ 178 \
159 RowVector idx (len); \ 179 NDArray idx (index.dims ()); \
160 \ 180 \
161 for (int i = 0; i < len; i++) \ 181 for (int i = 0; i < len; i++) \
162 { \ 182 { \
163 OCTAVE_QUIT; \ 183 OCTAVE_QUIT; \
164 int tmp = index.elem (i) + 1; \ 184 int tmp = index.elem (i) + 1; \
167 } \ 187 } \
168 \ 188 \
169 retval(1) = idx; \ 189 retval(1) = idx; \
170 } \ 190 } \
171 else \ 191 else \
172 retval(1) = Matrix (); \ 192 retval(1) = NDArray (); \
173 } \ 193 } \
174 else if (nargin == 2) \ 194 else \
175 { \ 195 { \
176 int arg1_is_scalar = arg1.is_scalar_type (); \ 196 int arg1_is_scalar = arg1.is_scalar_type (); \
177 int arg2_is_scalar = arg2.is_scalar_type (); \ 197 int arg2_is_scalar = arg2.is_scalar_type (); \
178 \ 198 \
179 int arg1_is_complex = arg1.is_complex_type (); \ 199 int arg1_is_complex = arg1.is_complex_type (); \
182 if (arg1_is_scalar) \ 202 if (arg1_is_scalar) \
183 { \ 203 { \
184 if (arg1_is_complex || arg2_is_complex) \ 204 if (arg1_is_complex || arg2_is_complex) \
185 { \ 205 { \
186 Complex c1 = arg1.complex_value (); \ 206 Complex c1 = arg1.complex_value (); \
187 ComplexMatrix m2 = arg2.complex_matrix_value (); \ 207 ComplexNDArray m2 = arg2.complex_array_value (); \
188 if (! error_state) \ 208 if (! error_state) \
189 { \ 209 { \
190 ComplexMatrix result = FCN (c1, m2); \ 210 ComplexNDArray result = FCN (c1, m2); \
191 if (! error_state) \ 211 if (! error_state) \
192 retval(0) = result; \ 212 retval(0) = result; \
193 } \ 213 } \
194 } \ 214 } \
195 else \ 215 else \
196 { \ 216 { \
197 double d1 = arg1.double_value (); \ 217 double d1 = arg1.double_value (); \
198 Matrix m2 = arg2.matrix_value (); \ 218 NDArray m2 = arg2.array_value (); \
199 \ 219 \
200 if (! error_state) \ 220 if (! error_state) \
201 { \ 221 { \
202 Matrix result = FCN (d1, m2); \ 222 NDArray result = FCN (d1, m2); \
203 if (! error_state) \ 223 if (! error_state) \
204 retval(0) = result; \ 224 retval(0) = result; \
205 } \ 225 } \
206 } \ 226 } \
207 } \ 227 } \
208 else if (arg2_is_scalar) \ 228 else if (arg2_is_scalar) \
209 { \ 229 { \
210 if (arg1_is_complex || arg2_is_complex) \ 230 if (arg1_is_complex || arg2_is_complex) \
211 { \ 231 { \
212 ComplexMatrix m1 = arg1.complex_matrix_value (); \ 232 ComplexNDArray m1 = arg1.complex_array_value (); \
213 \ 233 \
214 if (! error_state) \ 234 if (! error_state) \
215 { \ 235 { \
216 Complex c2 = arg2.complex_value (); \ 236 Complex c2 = arg2.complex_value (); \
217 ComplexMatrix result = FCN (m1, c2); \ 237 ComplexNDArray result = FCN (m1, c2); \
218 if (! error_state) \ 238 if (! error_state) \
219 retval(0) = result; \ 239 retval(0) = result; \
220 } \ 240 } \
221 } \ 241 } \
222 else \ 242 else \
223 { \ 243 { \
224 Matrix m1 = arg1.matrix_value (); \ 244 NDArray m1 = arg1.array_value (); \
225 \ 245 \
226 if (! error_state) \ 246 if (! error_state) \
227 { \ 247 { \
228 double d2 = arg2.double_value (); \ 248 double d2 = arg2.double_value (); \
229 Matrix result = FCN (m1, d2); \ 249 NDArray result = FCN (m1, d2); \
230 if (! error_state) \ 250 if (! error_state) \
231 retval(0) = result; \ 251 retval(0) = result; \
232 } \ 252 } \
233 } \ 253 } \
234 } \ 254 } \
235 else \ 255 else \
236 { \ 256 { \
237 if (arg1_is_complex || arg2_is_complex) \ 257 if (arg1_is_complex || arg2_is_complex) \
238 { \ 258 { \
239 ComplexMatrix m1 = arg1.complex_matrix_value (); \ 259 ComplexNDArray m1 = arg1.complex_array_value (); \
240 \ 260 \
241 if (! error_state) \ 261 if (! error_state) \
242 { \ 262 { \
243 ComplexMatrix m2 = arg2.complex_matrix_value (); \ 263 ComplexNDArray m2 = arg2.complex_array_value (); \
244 \ 264 \
245 if (! error_state) \ 265 if (! error_state) \
246 { \ 266 { \
247 ComplexMatrix result = FCN (m1, m2); \ 267 ComplexNDArray result = FCN (m1, m2); \
248 if (! error_state) \ 268 if (! error_state) \
249 retval(0) = result; \ 269 retval(0) = result; \
250 } \ 270 } \
251 } \ 271 } \
252 } \ 272 } \
253 else \ 273 else \
254 { \ 274 { \
255 Matrix m1 = arg1.matrix_value (); \ 275 NDArray m1 = arg1.array_value (); \
256 \ 276 \
257 if (! error_state) \ 277 if (! error_state) \
258 { \ 278 { \
259 Matrix m2 = arg2.matrix_value (); \ 279 NDArray m2 = arg2.array_value (); \
260 \ 280 \
261 if (! error_state) \ 281 if (! error_state) \
262 { \ 282 { \
263 Matrix result = FCN (m1, m2); \ 283 NDArray result = FCN (m1, m2); \
264 if (! error_state) \ 284 if (! error_state) \
265 retval(0) = result; \ 285 retval(0) = result; \
266 } \ 286 } \
267 } \ 287 } \
268 } \ 288 } \
269 } \ 289 } \
270 } \ 290 } \
271 else \
272 panic_impossible (); \
273 \ 291 \
274 return retval 292 return retval
275 293
276 DEFUN_DLD (min, args, nargout, 294 DEFUN_DLD (min, args, nargout,
277 "-*- texinfo -*-\n\ 295 "-*- texinfo -*-\n\
278 @deftypefn {Mapping Function} {} min (@var{x}, @var{y})\n\ 296 @deftypefn {Mapping Function} {} min (@var{x}, @var{y}, @var{dim})\n\
279 @deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} min (@var{x})\n\ 297 @deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} min (@var{x})\n\
280 @cindex Utility Functions\n\ 298 @cindex Utility Functions\n\
281 For a vector argument, return the minimum value. For a matrix\n\ 299 For a vector argument, return the minimum value. For a matrix\n\
282 argument, return the minimum value from each column, as a row\n\ 300 argument, return the minimum value from each column, as a row\n\
283 vector.\n\ 301 vector, or over the dimension @var{dim} if defined. For two matrices\n\
284 For two matrices (or a matrix and scalar),\n\ 302 (or a matrix and scalar), return the pair-wise minimum.\n\
285 return the pair-wise minimum.\n\
286 Thus,\n\ 303 Thus,\n\
287 \n\ 304 \n\
288 @example\n\ 305 @example\n\
289 min (min (@var{x}))\n\ 306 min (min (@var{x}))\n\
290 @end example\n\ 307 @end example\n\
321 MINMAX_BODY (min); 338 MINMAX_BODY (min);
322 } 339 }
323 340
324 DEFUN_DLD (max, args, nargout, 341 DEFUN_DLD (max, args, nargout,
325 "-*- texinfo -*-\n\ 342 "-*- texinfo -*-\n\
326 @deftypefn {Mapping Function} {} max (@var{x}, @var{y})\n\ 343 @deftypefn {Mapping Function} {} max (@var{x}, @var{y}, @var{dim})\n\
327 @deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} max (@var{x})\n\ 344 @deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} max (@var{x})\n\
328 @cindex Utility Functions\n\ 345 @cindex Utility Functions\n\
329 For a vector argument, return the maximum value. For a matrix\n\ 346 For a vector argument, return the maximum value. For a matrix\n\
330 argument, return the maximum value from each column, as a row\n\ 347 argument, return the maximum value from each column, as a row\n\
331 vector.\n\ 348 vector, or over the dimension @var{dim} if defined. For two matrices\n\
332 For two matrices (or a matrix and scalar),\n\ 349 (or a matrix and scalar), return the pair-wise maximum.\n\
333 return the pair-wise maximum.\n\
334 Thus,\n\ 350 Thus,\n\
335 \n\ 351 \n\
336 @example\n\ 352 @example\n\
337 max (max (@var{x}))\n\ 353 max (max (@var{x}))\n\
338 @end example\n\ 354 @end example\n\