Mercurial > hg > octave-nkf
annotate liboctave/CNDArray.cc @ 7904:1fddd9b8e862
Fix nil_rep reference counting in gl-render.cc::vertex_data internal class
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 09 Jul 2008 10:59:29 -0400 |
parents | 82be108cc558 |
children | 935be827eaf8 |
rev | line source |
---|---|
4514 | 1 // N-D Array manipulations. |
2 /* | |
3 | |
7017 | 4 Copyright (C) 1996, 1997, 2003, 2004, 2005, 2006, 2007 John W. Eaton |
4514 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
4514 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
4514 | 21 |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
25 #include <config.h> | |
26 #endif | |
27 | |
4687 | 28 #include <cfloat> |
5164 | 29 |
4780 | 30 #include <vector> |
4687 | 31 |
4588 | 32 #include "Array-util.h" |
4514 | 33 #include "CNDArray.h" |
34 #include "mx-base.h" | |
4773 | 35 #include "f77-fcn.h" |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
36 #include "functor.h" |
4514 | 37 #include "lo-ieee.h" |
4687 | 38 #include "lo-mappers.h" |
4514 | 39 |
4773 | 40 #if defined (HAVE_FFTW3) |
4780 | 41 #include "oct-fftw.h" |
4773 | 42 #else |
43 extern "C" | |
44 { | |
45 // Note that the original complex fft routines were not written for | |
46 // double complex arguments. They have been modified by adding an | |
47 // implicit double precision (a-h,o-z) statement at the beginning of | |
48 // each subroutine. | |
49 | |
50 F77_RET_T | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
51 F77_FUNC (zffti, ZFFTI) (const octave_idx_type&, Complex*); |
4773 | 52 |
53 F77_RET_T | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
54 F77_FUNC (zfftf, ZFFTF) (const octave_idx_type&, Complex*, Complex*); |
4773 | 55 |
56 F77_RET_T | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
57 F77_FUNC (zfftb, ZFFTB) (const octave_idx_type&, Complex*, Complex*); |
4773 | 58 } |
59 #endif | |
60 | |
61 #if defined (HAVE_FFTW3) | |
62 ComplexNDArray | |
63 ComplexNDArray::fourier (int dim) const | |
64 { | |
65 dim_vector dv = dims (); | |
66 | |
67 if (dim > dv.length () || dim < 0) | |
68 return ComplexNDArray (); | |
69 | |
5275 | 70 octave_idx_type stride = 1; |
71 octave_idx_type n = dv(dim); | |
4773 | 72 |
73 for (int i = 0; i < dim; i++) | |
74 stride *= dv(i); | |
75 | |
5275 | 76 octave_idx_type howmany = numel () / dv (dim); |
4773 | 77 howmany = (stride == 1 ? howmany : (howmany > stride ? stride : howmany)); |
5275 | 78 octave_idx_type nloop = (stride == 1 ? 1 : numel () / dv (dim) / stride); |
79 octave_idx_type dist = (stride == 1 ? n : 1); | |
4773 | 80 |
81 const Complex *in (fortran_vec ()); | |
82 ComplexNDArray retval (dv); | |
83 Complex *out (retval.fortran_vec ()); | |
84 | |
85 // Need to be careful here about the distance between fft's | |
5275 | 86 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 87 octave_fftw::fft (in + k * stride * n, out + k * stride * n, |
88 n, howmany, stride, dist); | |
89 | |
90 return retval; | |
91 } | |
92 | |
93 ComplexNDArray | |
4816 | 94 ComplexNDArray::ifourier (int dim) const |
4773 | 95 { |
96 dim_vector dv = dims (); | |
97 | |
98 if (dim > dv.length () || dim < 0) | |
99 return ComplexNDArray (); | |
100 | |
5275 | 101 octave_idx_type stride = 1; |
102 octave_idx_type n = dv(dim); | |
4773 | 103 |
104 for (int i = 0; i < dim; i++) | |
105 stride *= dv(i); | |
106 | |
5275 | 107 octave_idx_type howmany = numel () / dv (dim); |
4773 | 108 howmany = (stride == 1 ? howmany : (howmany > stride ? stride : howmany)); |
5275 | 109 octave_idx_type nloop = (stride == 1 ? 1 : numel () / dv (dim) / stride); |
110 octave_idx_type dist = (stride == 1 ? n : 1); | |
4773 | 111 |
112 const Complex *in (fortran_vec ()); | |
113 ComplexNDArray retval (dv); | |
114 Complex *out (retval.fortran_vec ()); | |
115 | |
116 // Need to be careful here about the distance between fft's | |
5275 | 117 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 118 octave_fftw::ifft (in + k * stride * n, out + k * stride * n, |
119 n, howmany, stride, dist); | |
120 | |
121 return retval; | |
122 } | |
123 | |
124 ComplexNDArray | |
125 ComplexNDArray::fourier2d (void) const | |
126 { | |
127 dim_vector dv = dims(); | |
128 if (dv.length () < 2) | |
129 return ComplexNDArray (); | |
130 | |
131 dim_vector dv2(dv(0), dv(1)); | |
132 const Complex *in = fortran_vec (); | |
133 ComplexNDArray retval (dv); | |
134 Complex *out = retval.fortran_vec (); | |
5275 | 135 octave_idx_type howmany = numel() / dv(0) / dv(1); |
136 octave_idx_type dist = dv(0) * dv(1); | |
4773 | 137 |
5275 | 138 for (octave_idx_type i=0; i < howmany; i++) |
4773 | 139 octave_fftw::fftNd (in + i*dist, out + i*dist, 2, dv2); |
140 | |
141 return retval; | |
142 } | |
143 | |
144 ComplexNDArray | |
145 ComplexNDArray::ifourier2d (void) const | |
146 { | |
147 dim_vector dv = dims(); | |
148 if (dv.length () < 2) | |
149 return ComplexNDArray (); | |
150 | |
151 dim_vector dv2(dv(0), dv(1)); | |
152 const Complex *in = fortran_vec (); | |
153 ComplexNDArray retval (dv); | |
154 Complex *out = retval.fortran_vec (); | |
5275 | 155 octave_idx_type howmany = numel() / dv(0) / dv(1); |
156 octave_idx_type dist = dv(0) * dv(1); | |
4773 | 157 |
5275 | 158 for (octave_idx_type i=0; i < howmany; i++) |
4773 | 159 octave_fftw::ifftNd (in + i*dist, out + i*dist, 2, dv2); |
160 | |
161 return retval; | |
162 } | |
163 | |
164 ComplexNDArray | |
165 ComplexNDArray::fourierNd (void) const | |
166 { | |
167 dim_vector dv = dims (); | |
168 int rank = dv.length (); | |
169 | |
170 const Complex *in (fortran_vec ()); | |
171 ComplexNDArray retval (dv); | |
172 Complex *out (retval.fortran_vec ()); | |
173 | |
174 octave_fftw::fftNd (in, out, rank, dv); | |
175 | |
176 return retval; | |
177 } | |
178 | |
179 ComplexNDArray | |
180 ComplexNDArray::ifourierNd (void) const | |
181 { | |
182 dim_vector dv = dims (); | |
183 int rank = dv.length (); | |
184 | |
185 const Complex *in (fortran_vec ()); | |
186 ComplexNDArray retval (dv); | |
187 Complex *out (retval.fortran_vec ()); | |
188 | |
189 octave_fftw::ifftNd (in, out, rank, dv); | |
190 | |
191 return retval; | |
192 } | |
193 | |
194 #else | |
195 ComplexNDArray | |
196 ComplexNDArray::fourier (int dim) const | |
197 { | |
198 dim_vector dv = dims (); | |
199 | |
200 if (dim > dv.length () || dim < 0) | |
201 return ComplexNDArray (); | |
202 | |
203 ComplexNDArray retval (dv); | |
5275 | 204 octave_idx_type npts = dv(dim); |
205 octave_idx_type nn = 4*npts+15; | |
4773 | 206 Array<Complex> wsave (nn); |
207 Complex *pwsave = wsave.fortran_vec (); | |
208 | |
209 OCTAVE_LOCAL_BUFFER (Complex, tmp, npts); | |
210 | |
5275 | 211 octave_idx_type stride = 1; |
4773 | 212 |
213 for (int i = 0; i < dim; i++) | |
214 stride *= dv(i); | |
215 | |
5275 | 216 octave_idx_type howmany = numel () / npts; |
4773 | 217 howmany = (stride == 1 ? howmany : (howmany > stride ? stride : howmany)); |
5275 | 218 octave_idx_type nloop = (stride == 1 ? 1 : numel () / npts / stride); |
219 octave_idx_type dist = (stride == 1 ? npts : 1); | |
4773 | 220 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
221 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
4773 | 222 |
5275 | 223 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 224 { |
5275 | 225 for (octave_idx_type j = 0; j < howmany; j++) |
4773 | 226 { |
227 OCTAVE_QUIT; | |
228 | |
5275 | 229 for (octave_idx_type i = 0; i < npts; i++) |
4773 | 230 tmp[i] = elem((i + k*npts)*stride + j*dist); |
231 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
232 F77_FUNC (zfftf, ZFFTF) (npts, tmp, pwsave); |
4773 | 233 |
5275 | 234 for (octave_idx_type i = 0; i < npts; i++) |
4773 | 235 retval ((i + k*npts)*stride + j*dist) = tmp[i]; |
236 } | |
237 } | |
238 | |
239 return retval; | |
240 } | |
241 | |
242 ComplexNDArray | |
243 ComplexNDArray::ifourier (int dim) const | |
244 { | |
245 dim_vector dv = dims (); | |
246 | |
247 if (dim > dv.length () || dim < 0) | |
248 return ComplexNDArray (); | |
249 | |
250 ComplexNDArray retval (dv); | |
5275 | 251 octave_idx_type npts = dv(dim); |
252 octave_idx_type nn = 4*npts+15; | |
4773 | 253 Array<Complex> wsave (nn); |
254 Complex *pwsave = wsave.fortran_vec (); | |
255 | |
256 OCTAVE_LOCAL_BUFFER (Complex, tmp, npts); | |
257 | |
5275 | 258 octave_idx_type stride = 1; |
4773 | 259 |
260 for (int i = 0; i < dim; i++) | |
261 stride *= dv(i); | |
262 | |
5275 | 263 octave_idx_type howmany = numel () / npts; |
4773 | 264 howmany = (stride == 1 ? howmany : (howmany > stride ? stride : howmany)); |
5275 | 265 octave_idx_type nloop = (stride == 1 ? 1 : numel () / npts / stride); |
266 octave_idx_type dist = (stride == 1 ? npts : 1); | |
4773 | 267 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
268 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
4773 | 269 |
5275 | 270 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 271 { |
5275 | 272 for (octave_idx_type j = 0; j < howmany; j++) |
4773 | 273 { |
274 OCTAVE_QUIT; | |
275 | |
5275 | 276 for (octave_idx_type i = 0; i < npts; i++) |
4773 | 277 tmp[i] = elem((i + k*npts)*stride + j*dist); |
278 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
279 F77_FUNC (zfftb, ZFFTB) (npts, tmp, pwsave); |
4773 | 280 |
5275 | 281 for (octave_idx_type i = 0; i < npts; i++) |
4773 | 282 retval ((i + k*npts)*stride + j*dist) = tmp[i] / |
283 static_cast<double> (npts); | |
284 } | |
285 } | |
286 | |
287 return retval; | |
288 } | |
289 | |
290 ComplexNDArray | |
291 ComplexNDArray::fourier2d (void) const | |
292 { | |
293 dim_vector dv = dims (); | |
294 dim_vector dv2 (dv(0), dv(1)); | |
295 int rank = 2; | |
296 ComplexNDArray retval (*this); | |
5275 | 297 octave_idx_type stride = 1; |
4773 | 298 |
299 for (int i = 0; i < rank; i++) | |
300 { | |
5275 | 301 octave_idx_type npts = dv2(i); |
302 octave_idx_type nn = 4*npts+15; | |
4773 | 303 Array<Complex> wsave (nn); |
304 Complex *pwsave = wsave.fortran_vec (); | |
305 Array<Complex> row (npts); | |
306 Complex *prow = row.fortran_vec (); | |
307 | |
5275 | 308 octave_idx_type howmany = numel () / npts; |
4773 | 309 howmany = (stride == 1 ? howmany : |
310 (howmany > stride ? stride : howmany)); | |
5275 | 311 octave_idx_type nloop = (stride == 1 ? 1 : numel () / npts / stride); |
312 octave_idx_type dist = (stride == 1 ? npts : 1); | |
4773 | 313 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
314 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
4773 | 315 |
5275 | 316 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 317 { |
5275 | 318 for (octave_idx_type j = 0; j < howmany; j++) |
4773 | 319 { |
320 OCTAVE_QUIT; | |
321 | |
5275 | 322 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 323 prow[l] = retval ((l + k*npts)*stride + j*dist); |
324 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
325 F77_FUNC (zfftf, ZFFTF) (npts, prow, pwsave); |
4773 | 326 |
5275 | 327 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 328 retval ((l + k*npts)*stride + j*dist) = prow[l]; |
329 } | |
330 } | |
331 | |
332 stride *= dv2(i); | |
333 } | |
334 | |
335 return retval; | |
336 } | |
337 | |
338 ComplexNDArray | |
339 ComplexNDArray::ifourier2d (void) const | |
340 { | |
341 dim_vector dv = dims(); | |
342 dim_vector dv2 (dv(0), dv(1)); | |
343 int rank = 2; | |
344 ComplexNDArray retval (*this); | |
5275 | 345 octave_idx_type stride = 1; |
4773 | 346 |
347 for (int i = 0; i < rank; i++) | |
348 { | |
5275 | 349 octave_idx_type npts = dv2(i); |
350 octave_idx_type nn = 4*npts+15; | |
4773 | 351 Array<Complex> wsave (nn); |
352 Complex *pwsave = wsave.fortran_vec (); | |
353 Array<Complex> row (npts); | |
354 Complex *prow = row.fortran_vec (); | |
355 | |
5275 | 356 octave_idx_type howmany = numel () / npts; |
4773 | 357 howmany = (stride == 1 ? howmany : |
358 (howmany > stride ? stride : howmany)); | |
5275 | 359 octave_idx_type nloop = (stride == 1 ? 1 : numel () / npts / stride); |
360 octave_idx_type dist = (stride == 1 ? npts : 1); | |
4773 | 361 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
362 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
4773 | 363 |
5275 | 364 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 365 { |
5275 | 366 for (octave_idx_type j = 0; j < howmany; j++) |
4773 | 367 { |
368 OCTAVE_QUIT; | |
369 | |
5275 | 370 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 371 prow[l] = retval ((l + k*npts)*stride + j*dist); |
372 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
373 F77_FUNC (zfftb, ZFFTB) (npts, prow, pwsave); |
4773 | 374 |
5275 | 375 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 376 retval ((l + k*npts)*stride + j*dist) = prow[l] / |
377 static_cast<double> (npts); | |
378 } | |
379 } | |
380 | |
381 stride *= dv2(i); | |
382 } | |
383 | |
384 return retval; | |
385 } | |
386 | |
387 ComplexNDArray | |
388 ComplexNDArray::fourierNd (void) const | |
389 { | |
390 dim_vector dv = dims (); | |
391 int rank = dv.length (); | |
392 ComplexNDArray retval (*this); | |
5275 | 393 octave_idx_type stride = 1; |
4773 | 394 |
395 for (int i = 0; i < rank; i++) | |
396 { | |
5275 | 397 octave_idx_type npts = dv(i); |
398 octave_idx_type nn = 4*npts+15; | |
4773 | 399 Array<Complex> wsave (nn); |
400 Complex *pwsave = wsave.fortran_vec (); | |
401 Array<Complex> row (npts); | |
402 Complex *prow = row.fortran_vec (); | |
403 | |
5275 | 404 octave_idx_type howmany = numel () / npts; |
4773 | 405 howmany = (stride == 1 ? howmany : |
406 (howmany > stride ? stride : howmany)); | |
5275 | 407 octave_idx_type nloop = (stride == 1 ? 1 : numel () / npts / stride); |
408 octave_idx_type dist = (stride == 1 ? npts : 1); | |
4773 | 409 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
410 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
4773 | 411 |
5275 | 412 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 413 { |
5275 | 414 for (octave_idx_type j = 0; j < howmany; j++) |
4773 | 415 { |
416 OCTAVE_QUIT; | |
417 | |
5275 | 418 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 419 prow[l] = retval ((l + k*npts)*stride + j*dist); |
420 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
421 F77_FUNC (zfftf, ZFFTF) (npts, prow, pwsave); |
4773 | 422 |
5275 | 423 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 424 retval ((l + k*npts)*stride + j*dist) = prow[l]; |
425 } | |
426 } | |
427 | |
428 stride *= dv(i); | |
429 } | |
430 | |
431 return retval; | |
432 } | |
433 | |
434 ComplexNDArray | |
435 ComplexNDArray::ifourierNd (void) const | |
436 { | |
437 dim_vector dv = dims (); | |
438 int rank = dv.length (); | |
439 ComplexNDArray retval (*this); | |
5275 | 440 octave_idx_type stride = 1; |
4773 | 441 |
442 for (int i = 0; i < rank; i++) | |
443 { | |
5275 | 444 octave_idx_type npts = dv(i); |
445 octave_idx_type nn = 4*npts+15; | |
4773 | 446 Array<Complex> wsave (nn); |
447 Complex *pwsave = wsave.fortran_vec (); | |
448 Array<Complex> row (npts); | |
449 Complex *prow = row.fortran_vec (); | |
450 | |
5275 | 451 octave_idx_type howmany = numel () / npts; |
4773 | 452 howmany = (stride == 1 ? howmany : |
453 (howmany > stride ? stride : howmany)); | |
5275 | 454 octave_idx_type nloop = (stride == 1 ? 1 : numel () / npts / stride); |
455 octave_idx_type dist = (stride == 1 ? npts : 1); | |
4773 | 456 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
457 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
4773 | 458 |
5275 | 459 for (octave_idx_type k = 0; k < nloop; k++) |
4773 | 460 { |
5275 | 461 for (octave_idx_type j = 0; j < howmany; j++) |
4773 | 462 { |
463 OCTAVE_QUIT; | |
464 | |
5275 | 465 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 466 prow[l] = retval ((l + k*npts)*stride + j*dist); |
467 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7620
diff
changeset
|
468 F77_FUNC (zfftb, ZFFTB) (npts, prow, pwsave); |
4773 | 469 |
5275 | 470 for (octave_idx_type l = 0; l < npts; l++) |
4773 | 471 retval ((l + k*npts)*stride + j*dist) = prow[l] / |
472 static_cast<double> (npts); | |
473 } | |
474 } | |
475 | |
476 stride *= dv(i); | |
477 } | |
478 | |
479 return retval; | |
480 } | |
481 | |
482 #endif | |
483 | |
4543 | 484 // unary operations |
485 | |
486 boolNDArray | |
487 ComplexNDArray::operator ! (void) const | |
488 { | |
489 boolNDArray b (dims ()); | |
490 | |
5275 | 491 for (octave_idx_type i = 0; i < length (); i++) |
5139 | 492 b.elem (i) = elem (i) == 0.0; |
4543 | 493 |
494 return b; | |
495 } | |
496 | |
5775 | 497 // FIXME -- this is not quite the right thing. |
4514 | 498 |
4687 | 499 bool |
500 ComplexNDArray::any_element_is_inf_or_nan (void) const | |
501 { | |
5275 | 502 octave_idx_type nel = nelem (); |
4687 | 503 |
5275 | 504 for (octave_idx_type i = 0; i < nel; i++) |
4687 | 505 { |
506 Complex val = elem (i); | |
507 if (xisinf (val) || xisnan (val)) | |
508 return true; | |
509 } | |
510 return false; | |
511 } | |
512 | |
513 // Return true if no elements have imaginary components. | |
514 | |
515 bool | |
516 ComplexNDArray::all_elements_are_real (void) const | |
517 { | |
5275 | 518 octave_idx_type nel = nelem (); |
4687 | 519 |
5275 | 520 for (octave_idx_type i = 0; i < nel; i++) |
4687 | 521 { |
5260 | 522 double ip = std::imag (elem (i)); |
4687 | 523 |
524 if (ip != 0.0 || lo_ieee_signbit (ip)) | |
525 return false; | |
526 } | |
527 | |
528 return true; | |
529 } | |
530 | |
531 // Return nonzero if any element of CM has a non-integer real or | |
532 // imaginary part. Also extract the largest and smallest (real or | |
533 // imaginary) values and return them in MAX_VAL and MIN_VAL. | |
534 | |
535 bool | |
536 ComplexNDArray::all_integers (double& max_val, double& min_val) const | |
537 { | |
5275 | 538 octave_idx_type nel = nelem (); |
4687 | 539 |
540 if (nel > 0) | |
541 { | |
542 Complex val = elem (0); | |
543 | |
5260 | 544 double r_val = std::real (val); |
545 double i_val = std::imag (val); | |
4687 | 546 |
547 max_val = r_val; | |
548 min_val = r_val; | |
549 | |
550 if (i_val > max_val) | |
551 max_val = i_val; | |
552 | |
553 if (i_val < max_val) | |
554 min_val = i_val; | |
555 } | |
556 else | |
557 return false; | |
558 | |
5275 | 559 for (octave_idx_type i = 0; i < nel; i++) |
4687 | 560 { |
561 Complex val = elem (i); | |
562 | |
5260 | 563 double r_val = std::real (val); |
564 double i_val = std::imag (val); | |
4687 | 565 |
566 if (r_val > max_val) | |
567 max_val = r_val; | |
568 | |
569 if (i_val > max_val) | |
570 max_val = i_val; | |
571 | |
572 if (r_val < min_val) | |
573 min_val = r_val; | |
574 | |
575 if (i_val < min_val) | |
576 min_val = i_val; | |
577 | |
578 if (D_NINT (r_val) != r_val || D_NINT (i_val) != i_val) | |
579 return false; | |
580 } | |
581 | |
582 return true; | |
583 } | |
584 | |
585 bool | |
586 ComplexNDArray::too_large_for_float (void) const | |
587 { | |
5275 | 588 octave_idx_type nel = nelem (); |
4687 | 589 |
5275 | 590 for (octave_idx_type i = 0; i < nel; i++) |
4687 | 591 { |
592 Complex val = elem (i); | |
593 | |
5260 | 594 double r_val = std::real (val); |
595 double i_val = std::imag (val); | |
4687 | 596 |
5389 | 597 if ((! (xisnan (r_val) || xisinf (r_val)) |
5387 | 598 && fabs (r_val) > FLT_MAX) |
5389 | 599 || (! (xisnan (i_val) || xisinf (i_val)) |
5387 | 600 && fabs (i_val) > FLT_MAX)) |
4687 | 601 return true; |
602 } | |
603 | |
604 return false; | |
605 } | |
606 | |
4556 | 607 boolNDArray |
4514 | 608 ComplexNDArray::all (int dim) const |
609 { | |
4569 | 610 MX_ND_ANY_ALL_REDUCTION |
611 (MX_ND_ALL_EVAL (elem (iter_idx) == Complex (0, 0)), true); | |
4514 | 612 } |
613 | |
4556 | 614 boolNDArray |
4514 | 615 ComplexNDArray::any (int dim) const |
616 { | |
4569 | 617 MX_ND_ANY_ALL_REDUCTION |
5110 | 618 (MX_ND_ANY_EVAL (elem (iter_idx) != Complex (0, 0) |
5260 | 619 && ! (lo_ieee_isnan (std::real (elem (iter_idx))) |
620 || lo_ieee_isnan (std::imag (elem (iter_idx))))), | |
5110 | 621 false); |
4569 | 622 } |
623 | |
4584 | 624 ComplexNDArray |
4569 | 625 ComplexNDArray::cumprod (int dim) const |
626 { | |
4584 | 627 MX_ND_CUMULATIVE_OP (ComplexNDArray, Complex, Complex (1, 0), *); |
4569 | 628 } |
629 | |
4584 | 630 ComplexNDArray |
4569 | 631 ComplexNDArray::cumsum (int dim) const |
632 { | |
4584 | 633 MX_ND_CUMULATIVE_OP (ComplexNDArray, Complex, Complex (0, 0), +); |
4569 | 634 } |
635 | |
636 ComplexNDArray | |
637 ComplexNDArray::prod (int dim) const | |
638 { | |
639 MX_ND_COMPLEX_OP_REDUCTION (*= elem (iter_idx), Complex (1, 0)); | |
640 } | |
641 | |
642 ComplexNDArray | |
643 ComplexNDArray::sumsq (int dim) const | |
644 { | |
645 MX_ND_COMPLEX_OP_REDUCTION | |
5260 | 646 (+= std::imag (elem (iter_idx)) |
4569 | 647 ? elem (iter_idx) * conj (elem (iter_idx)) |
648 : std::pow (elem (iter_idx), 2), Complex (0, 0)); | |
649 } | |
650 | |
651 ComplexNDArray | |
652 ComplexNDArray::sum (int dim) const | |
653 { | |
654 MX_ND_COMPLEX_OP_REDUCTION (+= elem (iter_idx), Complex (0, 0)); | |
655 } | |
656 | |
4915 | 657 ComplexNDArray |
5275 | 658 ComplexNDArray::concat (const ComplexNDArray& rb, const Array<octave_idx_type>& ra_idx) |
4915 | 659 { |
4940 | 660 if (rb.numel () > 0) |
5073 | 661 insert (rb, ra_idx); |
662 return *this; | |
4915 | 663 } |
664 | |
665 ComplexNDArray | |
5275 | 666 ComplexNDArray::concat (const NDArray& rb, const Array<octave_idx_type>& ra_idx) |
4758 | 667 { |
4915 | 668 ComplexNDArray tmp (rb); |
4940 | 669 if (rb.numel () > 0) |
5073 | 670 insert (tmp, ra_idx); |
671 return *this; | |
4915 | 672 } |
673 | |
674 ComplexNDArray | |
5275 | 675 concat (NDArray& ra, ComplexNDArray& rb, const Array<octave_idx_type>& ra_idx) |
4915 | 676 { |
677 ComplexNDArray retval (ra); | |
4940 | 678 if (rb.numel () > 0) |
4915 | 679 retval.insert (rb, ra_idx); |
680 return retval; | |
4758 | 681 } |
682 | |
4844 | 683 static const Complex Complex_NaN_result (octave_NaN, octave_NaN); |
684 | |
685 ComplexNDArray | |
686 ComplexNDArray::max (int dim) const | |
687 { | |
5275 | 688 ArrayN<octave_idx_type> dummy_idx; |
4844 | 689 return max (dummy_idx, dim); |
690 } | |
691 | |
692 ComplexNDArray | |
5275 | 693 ComplexNDArray::max (ArrayN<octave_idx_type>& idx_arg, int dim) const |
4844 | 694 { |
695 dim_vector dv = dims (); | |
696 dim_vector dr = dims (); | |
697 | |
698 if (dv.numel () == 0 || dim > dv.length () || dim < 0) | |
699 return ComplexNDArray (); | |
700 | |
701 dr(dim) = 1; | |
702 | |
703 ComplexNDArray result (dr); | |
704 idx_arg.resize (dr); | |
705 | |
5275 | 706 octave_idx_type x_stride = 1; |
707 octave_idx_type x_len = dv(dim); | |
4844 | 708 for (int i = 0; i < dim; i++) |
709 x_stride *= dv(i); | |
710 | |
5275 | 711 for (octave_idx_type i = 0; i < dr.numel (); i++) |
4844 | 712 { |
5275 | 713 octave_idx_type x_offset; |
4844 | 714 if (x_stride == 1) |
715 x_offset = i * x_len; | |
716 else | |
717 { | |
5275 | 718 octave_idx_type x_offset2 = 0; |
4844 | 719 x_offset = i; |
720 while (x_offset >= x_stride) | |
721 { | |
722 x_offset -= x_stride; | |
723 x_offset2++; | |
724 } | |
725 x_offset += x_offset2 * x_stride * x_len; | |
726 } | |
727 | |
5275 | 728 octave_idx_type idx_j; |
4844 | 729 |
730 Complex tmp_max; | |
731 | |
732 double abs_max = octave_NaN; | |
733 | |
734 for (idx_j = 0; idx_j < x_len; idx_j++) | |
735 { | |
736 tmp_max = elem (idx_j * x_stride + x_offset); | |
737 | |
5389 | 738 if (! xisnan (tmp_max)) |
4844 | 739 { |
5260 | 740 abs_max = std::abs(tmp_max); |
4844 | 741 break; |
742 } | |
743 } | |
744 | |
5275 | 745 for (octave_idx_type j = idx_j+1; j < x_len; j++) |
4844 | 746 { |
747 Complex tmp = elem (j * x_stride + x_offset); | |
748 | |
5389 | 749 if (xisnan (tmp)) |
4844 | 750 continue; |
751 | |
5260 | 752 double abs_tmp = std::abs (tmp); |
4844 | 753 |
754 if (abs_tmp > abs_max) | |
755 { | |
756 idx_j = j; | |
757 tmp_max = tmp; | |
758 abs_max = abs_tmp; | |
759 } | |
760 } | |
761 | |
5389 | 762 if (xisnan (tmp_max)) |
4844 | 763 { |
764 result.elem (i) = Complex_NaN_result; | |
765 idx_arg.elem (i) = 0; | |
766 } | |
767 else | |
768 { | |
769 result.elem (i) = tmp_max; | |
770 idx_arg.elem (i) = idx_j; | |
771 } | |
772 } | |
773 | |
7600
24abf5a702d9
Chop trailing singletons in min/max functions
David Bateman <dbateman@free.fr>
parents:
7503
diff
changeset
|
774 result.chop_trailing_singletons (); |
24abf5a702d9
Chop trailing singletons in min/max functions
David Bateman <dbateman@free.fr>
parents:
7503
diff
changeset
|
775 idx_arg.chop_trailing_singletons (); |
24abf5a702d9
Chop trailing singletons in min/max functions
David Bateman <dbateman@free.fr>
parents:
7503
diff
changeset
|
776 |
4844 | 777 return result; |
778 } | |
779 | |
780 ComplexNDArray | |
781 ComplexNDArray::min (int dim) const | |
782 { | |
5275 | 783 ArrayN<octave_idx_type> dummy_idx; |
4844 | 784 return min (dummy_idx, dim); |
785 } | |
786 | |
787 ComplexNDArray | |
5275 | 788 ComplexNDArray::min (ArrayN<octave_idx_type>& idx_arg, int dim) const |
4844 | 789 { |
790 dim_vector dv = dims (); | |
791 dim_vector dr = dims (); | |
792 | |
793 if (dv.numel () == 0 || dim > dv.length () || dim < 0) | |
794 return ComplexNDArray (); | |
795 | |
796 dr(dim) = 1; | |
797 | |
798 ComplexNDArray result (dr); | |
799 idx_arg.resize (dr); | |
800 | |
5275 | 801 octave_idx_type x_stride = 1; |
802 octave_idx_type x_len = dv(dim); | |
4844 | 803 for (int i = 0; i < dim; i++) |
804 x_stride *= dv(i); | |
805 | |
5275 | 806 for (octave_idx_type i = 0; i < dr.numel (); i++) |
4844 | 807 { |
5275 | 808 octave_idx_type x_offset; |
4844 | 809 if (x_stride == 1) |
810 x_offset = i * x_len; | |
811 else | |
812 { | |
5275 | 813 octave_idx_type x_offset2 = 0; |
4844 | 814 x_offset = i; |
815 while (x_offset >= x_stride) | |
816 { | |
817 x_offset -= x_stride; | |
818 x_offset2++; | |
819 } | |
820 x_offset += x_offset2 * x_stride * x_len; | |
821 } | |
822 | |
5275 | 823 octave_idx_type idx_j; |
4844 | 824 |
825 Complex tmp_min; | |
826 | |
827 double abs_min = octave_NaN; | |
828 | |
829 for (idx_j = 0; idx_j < x_len; idx_j++) | |
830 { | |
831 tmp_min = elem (idx_j * x_stride + x_offset); | |
832 | |
5389 | 833 if (! xisnan (tmp_min)) |
4844 | 834 { |
5260 | 835 abs_min = std::abs(tmp_min); |
4844 | 836 break; |
837 } | |
838 } | |
839 | |
5275 | 840 for (octave_idx_type j = idx_j+1; j < x_len; j++) |
4844 | 841 { |
842 Complex tmp = elem (j * x_stride + x_offset); | |
843 | |
5389 | 844 if (xisnan (tmp)) |
4844 | 845 continue; |
846 | |
5260 | 847 double abs_tmp = std::abs (tmp); |
4844 | 848 |
849 if (abs_tmp < abs_min) | |
850 { | |
851 idx_j = j; | |
852 tmp_min = tmp; | |
853 abs_min = abs_tmp; | |
854 } | |
855 } | |
856 | |
5389 | 857 if (xisnan (tmp_min)) |
4844 | 858 { |
859 result.elem (i) = Complex_NaN_result; | |
860 idx_arg.elem (i) = 0; | |
861 } | |
862 else | |
863 { | |
864 result.elem (i) = tmp_min; | |
865 idx_arg.elem (i) = idx_j; | |
866 } | |
867 } | |
868 | |
7600
24abf5a702d9
Chop trailing singletons in min/max functions
David Bateman <dbateman@free.fr>
parents:
7503
diff
changeset
|
869 result.chop_trailing_singletons (); |
24abf5a702d9
Chop trailing singletons in min/max functions
David Bateman <dbateman@free.fr>
parents:
7503
diff
changeset
|
870 idx_arg.chop_trailing_singletons (); |
24abf5a702d9
Chop trailing singletons in min/max functions
David Bateman <dbateman@free.fr>
parents:
7503
diff
changeset
|
871 |
4844 | 872 return result; |
873 } | |
874 | |
4634 | 875 NDArray |
4569 | 876 ComplexNDArray::abs (void) const |
877 { | |
4634 | 878 NDArray retval (dims ()); |
4569 | 879 |
5275 | 880 octave_idx_type nel = nelem (); |
4634 | 881 |
5275 | 882 for (octave_idx_type i = 0; i < nel; i++) |
5260 | 883 retval(i) = std::abs (elem (i)); |
4569 | 884 |
885 return retval; | |
4514 | 886 } |
887 | |
4765 | 888 ComplexNDArray& |
5275 | 889 ComplexNDArray::insert (const NDArray& a, octave_idx_type r, octave_idx_type c) |
4765 | 890 { |
891 dim_vector a_dv = a.dims (); | |
892 | |
893 int n = a_dv.length (); | |
894 | |
895 if (n == dimensions.length ()) | |
896 { | |
5275 | 897 Array<octave_idx_type> a_ra_idx (a_dv.length (), 0); |
4765 | 898 |
899 a_ra_idx.elem (0) = r; | |
900 a_ra_idx.elem (1) = c; | |
901 | |
902 for (int i = 0; i < n; i++) | |
903 { | |
904 if (a_ra_idx (i) < 0 || (a_ra_idx (i) + a_dv (i)) > dimensions (i)) | |
905 { | |
906 (*current_liboctave_error_handler) | |
907 ("Array<T>::insert: range error for insert"); | |
908 return *this; | |
909 } | |
910 } | |
911 | |
912 a_ra_idx.elem (0) = 0; | |
913 a_ra_idx.elem (1) = 0; | |
914 | |
5275 | 915 octave_idx_type n_elt = a.numel (); |
4765 | 916 |
917 // IS make_unique () NECCESSARY HERE?? | |
918 | |
5275 | 919 for (octave_idx_type i = 0; i < n_elt; i++) |
4765 | 920 { |
5275 | 921 Array<octave_idx_type> ra_idx = a_ra_idx; |
4765 | 922 |
923 ra_idx.elem (0) = a_ra_idx (0) + r; | |
924 ra_idx.elem (1) = a_ra_idx (1) + c; | |
925 | |
926 elem (ra_idx) = a.elem (a_ra_idx); | |
927 | |
928 increment_index (a_ra_idx, a_dv); | |
929 } | |
930 } | |
931 else | |
932 (*current_liboctave_error_handler) | |
933 ("Array<T>::insert: invalid indexing operation"); | |
934 | |
935 return *this; | |
936 } | |
937 | |
938 ComplexNDArray& | |
5275 | 939 ComplexNDArray::insert (const ComplexNDArray& a, octave_idx_type r, octave_idx_type c) |
4765 | 940 { |
941 Array<Complex>::insert (a, r, c); | |
942 return *this; | |
943 } | |
944 | |
4915 | 945 ComplexNDArray& |
5275 | 946 ComplexNDArray::insert (const ComplexNDArray& a, const Array<octave_idx_type>& ra_idx) |
4915 | 947 { |
948 Array<Complex>::insert (a, ra_idx); | |
949 return *this; | |
950 } | |
951 | |
4514 | 952 ComplexMatrix |
953 ComplexNDArray::matrix_value (void) const | |
954 { | |
955 ComplexMatrix retval; | |
956 | |
957 int nd = ndims (); | |
958 | |
959 switch (nd) | |
960 { | |
961 case 1: | |
962 retval = ComplexMatrix (Array2<Complex> (*this, dimensions(0), 1)); | |
963 break; | |
964 | |
965 case 2: | |
966 retval = ComplexMatrix (Array2<Complex> (*this, dimensions(0), | |
967 dimensions(1))); | |
968 break; | |
969 | |
970 default: | |
971 (*current_liboctave_error_handler) | |
4770 | 972 ("invalid conversion of ComplexNDArray to ComplexMatrix"); |
4514 | 973 break; |
974 } | |
975 | |
976 return retval; | |
977 } | |
978 | |
4532 | 979 void |
5275 | 980 ComplexNDArray::increment_index (Array<octave_idx_type>& ra_idx, |
4532 | 981 const dim_vector& dimensions, |
982 int start_dimension) | |
983 { | |
984 ::increment_index (ra_idx, dimensions, start_dimension); | |
985 } | |
986 | |
5275 | 987 octave_idx_type |
988 ComplexNDArray::compute_index (Array<octave_idx_type>& ra_idx, | |
4556 | 989 const dim_vector& dimensions) |
990 { | |
991 return ::compute_index (ra_idx, dimensions); | |
992 } | |
993 | |
7620
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7600
diff
changeset
|
994 ComplexNDArray |
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7600
diff
changeset
|
995 ComplexNDArray::diag (octave_idx_type k) const |
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7600
diff
changeset
|
996 { |
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7600
diff
changeset
|
997 return MArrayN<Complex>::diag (k); |
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7600
diff
changeset
|
998 } |
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7600
diff
changeset
|
999 |
7503
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1000 NDArray |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1001 ComplexNDArray::map (dmapper fcn) const |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1002 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1003 return MArrayN<Complex>::map<double> (func_ptr (fcn)); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1004 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1005 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1006 ComplexNDArray |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1007 ComplexNDArray::map (cmapper fcn) const |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1008 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1009 return MArrayN<Complex>::map<Complex> (func_ptr (fcn)); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1010 } |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1011 |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1012 boolNDArray |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1013 ComplexNDArray::map (bmapper fcn) const |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1014 { |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1015 return MArrayN<Complex>::map<bool> (func_ptr (fcn)); |
8c32f95c2639
convert mapper functions to new format
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1016 } |
4687 | 1017 |
1018 // This contains no information on the array structure !!! | |
1019 std::ostream& | |
1020 operator << (std::ostream& os, const ComplexNDArray& a) | |
1021 { | |
5275 | 1022 octave_idx_type nel = a.nelem (); |
4687 | 1023 |
5275 | 1024 for (octave_idx_type i = 0; i < nel; i++) |
4687 | 1025 { |
1026 os << " "; | |
1027 octave_write_complex (os, a.elem (i)); | |
1028 os << "\n"; | |
1029 } | |
1030 return os; | |
1031 } | |
1032 | |
1033 std::istream& | |
1034 operator >> (std::istream& is, ComplexNDArray& a) | |
1035 { | |
5275 | 1036 octave_idx_type nel = a.nelem (); |
4687 | 1037 |
1038 if (nel < 1 ) | |
1039 is.clear (std::ios::badbit); | |
1040 else | |
1041 { | |
1042 Complex tmp; | |
5275 | 1043 for (octave_idx_type i = 0; i < nel; i++) |
4687 | 1044 { |
1045 tmp = octave_read_complex (is); | |
1046 if (is) | |
1047 a.elem (i) = tmp; | |
1048 else | |
1049 goto done; | |
1050 } | |
1051 } | |
1052 | |
1053 done: | |
1054 | |
1055 return is; | |
1056 } | |
1057 | |
5775 | 1058 // FIXME -- it would be nice to share code among the min/max |
4844 | 1059 // functions below. |
1060 | |
1061 #define EMPTY_RETURN_CHECK(T) \ | |
1062 if (nel == 0) \ | |
1063 return T (dv); | |
1064 | |
1065 ComplexNDArray | |
1066 min (const Complex& c, const ComplexNDArray& m) | |
1067 { | |
1068 dim_vector dv = m.dims (); | |
1069 int nel = dv.numel (); | |
1070 | |
1071 EMPTY_RETURN_CHECK (ComplexNDArray); | |
1072 | |
1073 ComplexNDArray result (dv); | |
1074 | |
1075 for (int i = 0; i < nel; i++) | |
1076 { | |
1077 OCTAVE_QUIT; | |
1078 result (i) = xmin (c, m (i)); | |
1079 } | |
1080 | |
1081 return result; | |
1082 } | |
1083 | |
1084 ComplexNDArray | |
1085 min (const ComplexNDArray& m, const Complex& c) | |
1086 { | |
1087 dim_vector dv = m.dims (); | |
1088 int nel = dv.numel (); | |
1089 | |
1090 EMPTY_RETURN_CHECK (ComplexNDArray); | |
1091 | |
1092 ComplexNDArray result (dv); | |
1093 | |
1094 for (int i = 0; i < nel; i++) | |
1095 { | |
1096 OCTAVE_QUIT; | |
1097 result (i) = xmin (c, m (i)); | |
1098 } | |
1099 | |
1100 return result; | |
1101 } | |
1102 | |
1103 ComplexNDArray | |
1104 min (const ComplexNDArray& a, const ComplexNDArray& b) | |
1105 { | |
1106 dim_vector dv = a.dims (); | |
1107 int nel = dv.numel (); | |
1108 | |
1109 if (dv != b.dims ()) | |
1110 { | |
1111 (*current_liboctave_error_handler) | |
1112 ("two-arg min expecting args of same size"); | |
1113 return ComplexNDArray (); | |
1114 } | |
1115 | |
1116 EMPTY_RETURN_CHECK (ComplexNDArray); | |
1117 | |
1118 ComplexNDArray result (dv); | |
1119 | |
1120 for (int i = 0; i < nel; i++) | |
1121 { | |
1122 OCTAVE_QUIT; | |
1123 result (i) = xmin (a (i), b (i)); | |
1124 } | |
1125 | |
1126 return result; | |
1127 } | |
1128 | |
1129 ComplexNDArray | |
1130 max (const Complex& c, const ComplexNDArray& m) | |
1131 { | |
1132 dim_vector dv = m.dims (); | |
1133 int nel = dv.numel (); | |
1134 | |
1135 EMPTY_RETURN_CHECK (ComplexNDArray); | |
1136 | |
1137 ComplexNDArray result (dv); | |
1138 | |
1139 for (int i = 0; i < nel; i++) | |
1140 { | |
1141 OCTAVE_QUIT; | |
1142 result (i) = xmax (c, m (i)); | |
1143 } | |
1144 | |
1145 return result; | |
1146 } | |
1147 | |
1148 ComplexNDArray | |
1149 max (const ComplexNDArray& m, const Complex& c) | |
1150 { | |
1151 dim_vector dv = m.dims (); | |
1152 int nel = dv.numel (); | |
1153 | |
1154 EMPTY_RETURN_CHECK (ComplexNDArray); | |
1155 | |
1156 ComplexNDArray result (dv); | |
1157 | |
1158 for (int i = 0; i < nel; i++) | |
1159 { | |
1160 OCTAVE_QUIT; | |
1161 result (i) = xmax (c, m (i)); | |
1162 } | |
1163 | |
1164 return result; | |
1165 } | |
1166 | |
1167 ComplexNDArray | |
1168 max (const ComplexNDArray& a, const ComplexNDArray& b) | |
1169 { | |
1170 dim_vector dv = a.dims (); | |
1171 int nel = dv.numel (); | |
1172 | |
1173 if (dv != b.dims ()) | |
1174 { | |
1175 (*current_liboctave_error_handler) | |
1176 ("two-arg max expecting args of same size"); | |
1177 return ComplexNDArray (); | |
1178 } | |
1179 | |
1180 EMPTY_RETURN_CHECK (ComplexNDArray); | |
1181 | |
1182 ComplexNDArray result (dv); | |
1183 | |
1184 for (int i = 0; i < nel; i++) | |
1185 { | |
1186 OCTAVE_QUIT; | |
1187 result (i) = xmax (a (i), b (i)); | |
1188 } | |
1189 | |
1190 return result; | |
1191 } | |
1192 | |
5260 | 1193 NDS_CMP_OPS(ComplexNDArray, std::real, Complex, std::real) |
4543 | 1194 NDS_BOOL_OPS(ComplexNDArray, Complex, 0.0) |
1195 | |
5260 | 1196 SND_CMP_OPS(Complex, std::real, ComplexNDArray, std::real) |
4543 | 1197 SND_BOOL_OPS(Complex, ComplexNDArray, 0.0) |
1198 | |
5260 | 1199 NDND_CMP_OPS(ComplexNDArray, std::real, ComplexNDArray, std::real) |
4543 | 1200 NDND_BOOL_OPS(ComplexNDArray, ComplexNDArray, 0.0) |
1201 | |
4514 | 1202 /* |
1203 ;;; Local Variables: *** | |
1204 ;;; mode: C++ *** | |
1205 ;;; End: *** | |
1206 */ |