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