GNU Octave  6.2.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
fCNDArray.cc
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (C) 1996-2021 The Octave Project Developers
4 //
5 // See the file COPYRIGHT.md in the top-level directory of this
6 // distribution or <https://octave.org/copyright/>.
7 //
8 // This file is part of Octave.
9 //
10 // Octave is free software: you can redistribute it and/or modify it
11 // under the terms of the GNU General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // Octave is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with Octave; see the file COPYING. If not, see
22 // <https://www.gnu.org/licenses/>.
23 //
24 ////////////////////////////////////////////////////////////////////////
25 
26 #if defined (HAVE_CONFIG_H)
27 # include "config.h"
28 #endif
29 
30 #include <complex>
31 #include <istream>
32 #include <ostream>
33 
34 #include "Array-util.h"
35 #include "f77-fcn.h"
36 #include "fCNDArray.h"
37 #include "lo-ieee.h"
38 #include "lo-mappers.h"
39 #include "mx-base.h"
40 #include "mx-op-defs.h"
41 #include "mx-fcnda-fs.h"
42 #include "oct-fftw.h"
43 #include "oct-locbuf.h"
44 
45 #include "bsxfun-defs.cc"
46 
48  : MArray<FloatComplex> (a.dims ())
49 {
50  octave_idx_type n = a.numel ();
51  for (octave_idx_type i = 0; i < n; i++)
52  xelem (i) = static_cast<unsigned char> (a(i));
53 }
54 
55 #if defined (HAVE_FFTW)
56 
59 {
60  dim_vector dv = dims ();
61 
62  if (dim > dv.ndims () || dim < 0)
63  return FloatComplexNDArray ();
64 
65  octave_idx_type stride = 1;
66  octave_idx_type n = dv(dim);
67 
68  for (int i = 0; i < dim; i++)
69  stride *= dv(i);
70 
71  octave_idx_type howmany = numel () / dv(dim);
72  howmany = (stride == 1 ? howmany : (howmany > stride ? stride : howmany));
73  octave_idx_type nloop = (stride == 1 ? 1 : numel () / dv(dim) / stride);
74  octave_idx_type dist = (stride == 1 ? n : 1);
75 
76  const FloatComplex *in (fortran_vec ());
79 
80  // Need to be careful here about the distance between fft's
81  for (octave_idx_type k = 0; k < nloop; k++)
82  octave::fftw::fft (in + k * stride * n, out + k * stride * n,
83  n, howmany, stride, dist);
84 
85  return retval;
86 }
87 
90 {
91  dim_vector dv = dims ();
92 
93  if (dim > dv.ndims () || dim < 0)
94  return FloatComplexNDArray ();
95 
96  octave_idx_type stride = 1;
97  octave_idx_type n = dv(dim);
98 
99  for (int i = 0; i < dim; i++)
100  stride *= dv(i);
101 
102  octave_idx_type howmany = numel () / dv(dim);
103  howmany = (stride == 1 ? howmany : (howmany > stride ? stride : howmany));
104  octave_idx_type nloop = (stride == 1 ? 1 : numel () / dv(dim) / stride);
105  octave_idx_type dist = (stride == 1 ? n : 1);
106 
107  const FloatComplex *in (fortran_vec ());
109  FloatComplex *out (retval.fortran_vec ());
110 
111  // Need to be careful here about the distance between fft's
112  for (octave_idx_type k = 0; k < nloop; k++)
113  octave::fftw::ifft (in + k * stride * n, out + k * stride * n,
114  n, howmany, stride, dist);
115 
116  return retval;
117 }
118 
121 {
122  dim_vector dv = dims ();
123  if (dv.ndims () < 2)
124  return FloatComplexNDArray ();
125 
126  dim_vector dv2 (dv(0), dv(1));
127  const FloatComplex *in = fortran_vec ();
129  FloatComplex *out = retval.fortran_vec ();
130  octave_idx_type howmany = numel () / dv(0) / dv(1);
131  octave_idx_type dist = dv(0) * dv(1);
132 
133  for (octave_idx_type i=0; i < howmany; i++)
134  octave::fftw::fftNd (in + i*dist, out + i*dist, 2, dv2);
135 
136  return retval;
137 }
138 
141 {
142  dim_vector dv = dims ();
143  if (dv.ndims () < 2)
144  return FloatComplexNDArray ();
145 
146  dim_vector dv2 (dv(0), dv(1));
147  const FloatComplex *in = fortran_vec ();
149  FloatComplex *out = retval.fortran_vec ();
150  octave_idx_type howmany = numel () / dv(0) / dv(1);
151  octave_idx_type dist = dv(0) * dv(1);
152 
153  for (octave_idx_type i=0; i < howmany; i++)
154  octave::fftw::ifftNd (in + i*dist, out + i*dist, 2, dv2);
155 
156  return retval;
157 }
158 
161 {
162  dim_vector dv = dims ();
163  int rank = dv.ndims ();
164 
165  const FloatComplex *in (fortran_vec ());
167  FloatComplex *out (retval.fortran_vec ());
168 
169  octave::fftw::fftNd (in, out, rank, dv);
170 
171  return retval;
172 }
173 
176 {
177  dim_vector dv = dims ();
178  int rank = dv.ndims ();
179 
180  const FloatComplex *in (fortran_vec ());
182  FloatComplex *out (retval.fortran_vec ());
183 
184  octave::fftw::ifftNd (in, out, rank, dv);
185 
186  return retval;
187 }
188 
189 #else
190 
192 FloatComplexNDArray::fourier (int dim) const
193 {
194  octave_unused_parameter (dim);
195 
196  (*current_liboctave_error_handler)
197  ("support for FFTW was unavailable or disabled when liboctave was built");
198 
199  return FloatComplexNDArray ();
200 }
201 
203 FloatComplexNDArray::ifourier (int dim) const
204 {
205  octave_unused_parameter (dim);
206 
207  (*current_liboctave_error_handler)
208  ("support for FFTW was unavailable or disabled when liboctave was built");
209 
210  return FloatComplexNDArray ();
211 }
212 
215 {
216  (*current_liboctave_error_handler)
217  ("support for FFTW was unavailable or disabled when liboctave was built");
218 
219  return FloatComplexNDArray ();
220 }
221 
224 {
225  (*current_liboctave_error_handler)
226  ("support for FFTW was unavailable or disabled when liboctave was built");
227 
228  return FloatComplexNDArray ();
229 }
230 
233 {
234  (*current_liboctave_error_handler)
235  ("support for FFTW was unavailable or disabled when liboctave was built");
236 
237  return FloatComplexNDArray ();
238 }
239 
242 {
243  (*current_liboctave_error_handler)
244  ("support for FFTW was unavailable or disabled when liboctave was built");
245 
246  return FloatComplexNDArray ();
247 }
248 
249 #endif
250 
251 // unary operations
252 
255 {
256  if (any_element_is_nan ())
258 
259  return do_mx_unary_op<bool, FloatComplex> (*this, mx_inline_not);
260 }
261 
262 // FIXME: this is not quite the right thing.
263 
264 bool
266 {
267  return do_mx_check<FloatComplex> (*this, mx_inline_any_nan);
268 }
269 
270 bool
272 {
273  return ! do_mx_check<FloatComplex> (*this, mx_inline_all_finite);
274 }
275 
276 // Return true if no elements have imaginary components.
277 
278 bool
280 {
281  return do_mx_check<FloatComplex> (*this, mx_inline_all_real);
282 }
283 
284 // Return nonzero if any element of CM has a non-integer real or
285 // imaginary part. Also extract the largest and smallest (real or
286 // imaginary) values and return them in MAX_VAL and MIN_VAL.
287 
288 bool
289 FloatComplexNDArray::all_integers (float& max_val, float& min_val) const
290 {
291  octave_idx_type nel = numel ();
292 
293  if (nel > 0)
294  {
295  FloatComplex val = elem (0);
296 
297  float r_val = val.real ();
298  float i_val = val.imag ();
299 
300  max_val = r_val;
301  min_val = r_val;
302 
303  if (i_val > max_val)
304  max_val = i_val;
305 
306  if (i_val < max_val)
307  min_val = i_val;
308  }
309  else
310  return false;
311 
312  for (octave_idx_type i = 0; i < nel; i++)
313  {
314  FloatComplex val = elem (i);
315 
316  float r_val = val.real ();
317  float i_val = val.imag ();
318 
319  if (r_val > max_val)
320  max_val = r_val;
321 
322  if (i_val > max_val)
323  max_val = i_val;
324 
325  if (r_val < min_val)
326  min_val = r_val;
327 
328  if (i_val < min_val)
329  min_val = i_val;
330 
331  if (octave::math::x_nint (r_val) != r_val
332  || octave::math::x_nint (i_val) != i_val)
333  return false;
334  }
335 
336  return true;
337 }
338 
339 bool
341 {
342  return false;
343 }
344 
347 {
348  return do_mx_red_op<bool, FloatComplex> (*this, dim, mx_inline_all);
349 }
350 
353 {
354  return do_mx_red_op<bool, FloatComplex> (*this, dim, mx_inline_any);
355 }
356 
359 {
360  return do_mx_cum_op<FloatComplex, FloatComplex> (*this, dim,
362 }
363 
366 {
367  return do_mx_cum_op<FloatComplex, FloatComplex> (*this, dim,
369 }
370 
373 {
374  return do_mx_red_op<FloatComplex, FloatComplex> (*this, dim, mx_inline_prod);
375 }
376 
379 {
380  return do_mx_red_op<Complex, FloatComplex> (*this, dim, mx_inline_dprod);
381 }
382 
385 {
386  return do_mx_red_op<FloatComplex, FloatComplex> (*this, dim, mx_inline_sum);
387 }
388 
391 {
392  return do_mx_red_op<Complex, FloatComplex> (*this, dim, mx_inline_dsum);
393 }
394 
397 {
398  return do_mx_red_op<float, FloatComplex> (*this, dim, mx_inline_sumsq);
399 }
400 
403 {
404  return do_mx_diff_op<FloatComplex> (*this, dim, order, mx_inline_diff);
405 }
406 
410 {
411  if (rb.numel () > 0)
412  insert (rb, ra_idx);
413  return *this;
414 }
415 
419 {
420  FloatComplexNDArray tmp (rb);
421  if (rb.numel () > 0)
422  insert (tmp, ra_idx);
423  return *this;
424 }
425 
429 {
431  if (rb.numel () > 0)
432  retval.insert (rb, ra_idx);
433  return retval;
434 }
435 
438 
441 {
442  return do_mx_minmax_op<FloatComplex> (*this, dim, mx_inline_max);
443 }
444 
447 {
448  return do_mx_minmax_op<FloatComplex> (*this, idx_arg, dim, mx_inline_max);
449 }
450 
453 {
454  return do_mx_minmax_op<FloatComplex> (*this, dim, mx_inline_min);
455 }
456 
459 {
460  return do_mx_minmax_op<FloatComplex> (*this, idx_arg, dim, mx_inline_min);
461 }
462 
465 {
466  return do_mx_cumminmax_op<FloatComplex> (*this, dim, mx_inline_cummax);
467 }
468 
471 {
472  return do_mx_cumminmax_op<FloatComplex> (*this, idx_arg, dim,
474 }
475 
478 {
479  return do_mx_cumminmax_op<FloatComplex> (*this, dim, mx_inline_cummin);
480 }
481 
484 {
485  return do_mx_cumminmax_op<FloatComplex> (*this, idx_arg, dim,
487 }
488 
491 {
492  return do_mx_unary_map<float, FloatComplex, std::abs> (*this);
493 }
494 
497 {
498  return do_mx_unary_map<bool, FloatComplex, octave::math::isnan> (*this);
499 }
500 
503 {
504  return do_mx_unary_map<bool, FloatComplex, octave::math::isinf> (*this);
505 }
506 
509 {
510  return do_mx_unary_map<bool, FloatComplex, octave::math::isfinite> (*this);
511 }
512 
515 {
516  return do_mx_unary_map<FloatComplex, FloatComplex, std::conj<float>> (a);
517 }
518 
522 {
523  dim_vector a_dv = a.dims ();
524 
525  int n = a_dv.ndims ();
526 
527  if (n == dimensions.ndims ())
528  {
529  Array<octave_idx_type> a_ra_idx (dim_vector (a_dv.ndims (), 1), 0);
530 
531  a_ra_idx.elem (0) = r;
532  a_ra_idx.elem (1) = c;
533 
534  for (int i = 0; i < n; i++)
535  {
536  if (a_ra_idx(i) < 0 || (a_ra_idx(i) + a_dv(i)) > dimensions(i))
537  (*current_liboctave_error_handler)
538  ("Array<T>::insert: range error for insert");
539  }
540 
541  a_ra_idx.elem (0) = 0;
542  a_ra_idx.elem (1) = 0;
543 
544  octave_idx_type n_elt = a.numel ();
545 
546  // IS make_unique () NECESSARY HERE?
547 
548  for (octave_idx_type i = 0; i < n_elt; i++)
549  {
550  Array<octave_idx_type> ra_idx = a_ra_idx;
551 
552  ra_idx.elem (0) = a_ra_idx(0) + r;
553  ra_idx.elem (1) = a_ra_idx(1) + c;
554 
555  elem (ra_idx) = a.elem (a_ra_idx);
556 
557  increment_index (a_ra_idx, a_dv);
558  }
559  }
560  else
562  ("Array<T>::insert: invalid indexing operation");
563 
564  return *this;
565 }
566 
570 {
572  return *this;
573 }
574 
578 {
580  return *this;
581 }
582 
583 void
585  const dim_vector& dimensions,
586  int start_dimension)
587 {
588  ::increment_index (ra_idx, dimensions, start_dimension);
589 }
590 
593  const dim_vector& dimensions)
594 {
596 }
597 
600 {
601  return MArray<FloatComplex>::diag (k);
602 }
603 
606 {
607  return MArray<FloatComplex>::diag (m, n);
608 }
609 
610 // This contains no information on the array structure !!!
611 std::ostream&
612 operator << (std::ostream& os, const FloatComplexNDArray& a)
613 {
614  octave_idx_type nel = a.numel ();
615 
616  for (octave_idx_type i = 0; i < nel; i++)
617  {
618  os << ' ';
619  octave_write_complex (os, a.elem (i));
620  os << "\n";
621  }
622  return os;
623 }
624 
625 std::istream&
626 operator >> (std::istream& is, FloatComplexNDArray& a)
627 {
628  octave_idx_type nel = a.numel ();
629 
630  if (nel > 0)
631  {
632  FloatComplex tmp;
633  for (octave_idx_type i = 0; i < nel; i++)
634  {
635  tmp = octave_read_value<FloatComplex> (is);
636  if (is)
637  a.elem (i) = tmp;
638  else
639  return is;
640  }
641  }
642 
643  return is;
644 }
645 
647 
650 
653 
656 
657 FloatComplexNDArray& operator *= (FloatComplexNDArray& a, float s)
658 {
659  if (a.is_shared ())
660  a = a * s;
661  else
662  do_ms_inplace_op<FloatComplex, float> (a, s, mx_inline_mul2);
663  return a;
664 }
665 
667 {
668  if (a.is_shared ())
669  a = a / s;
670  else
671  do_ms_inplace_op<FloatComplex, float> (a, s, mx_inline_div2);
672  return a;
673 }
674 
677 
octave_idx_type compute_index(octave_idx_type n, const dim_vector &dims)
Definition: Array-util.cc:177
#define NaN
Definition: Faddeeva.cc:248
#define BSXFUN_STDREL_DEFS_MXLOOP(ARRAY)
Definition: bsxfun-defs.cc:244
#define BSXFUN_STDOP_DEFS_MXLOOP(ARRAY)
Definition: bsxfun-defs.cc:236
#define BSXFUN_OP_DEF_MXLOOP(OP, ARRAY, LOOP)
Definition: bsxfun-defs.cc:221
Array< T > & insert(const Array< T > &a, const Array< octave_idx_type > &idx)
Insert an array into another at a specified position.
Definition: Array.cc:1584
T & xelem(octave_idx_type n)
Size of the specified dimension.
Definition: Array.h:469
octave_idx_type numel(void) const
Number of elements in the array.
Definition: Array.h:377
dim_vector dimensions
Definition: Array.h:217
T & elem(octave_idx_type n)
Size of the specified dimension.
Definition: Array.h:499
Array< T > diag(octave_idx_type k=0) const
Get the kth super or subdiagonal.
Definition: Array.cc:2528
const dim_vector & dims(void) const
Return a const-reference so that dims ()(i) works efficiently.
Definition: Array.h:453
const T * fortran_vec(void) const
Size of the specified dimension.
Definition: Array.h:583
bool is_shared(void)
Size of the specified dimension.
Definition: Array.h:587
FloatNDArray abs(void) const
Definition: fCNDArray.cc:490
FloatComplexNDArray max(int dim=-1) const
Definition: fCNDArray.cc:440
bool all_integers(float &max_val, float &min_val) const
Definition: fCNDArray.cc:289
boolNDArray isnan(void) const
Definition: fCNDArray.cc:496
FloatComplexNDArray sum(int dim=-1) const
Definition: fCNDArray.cc:384
boolNDArray isinf(void) const
Definition: fCNDArray.cc:502
FloatComplexNDArray min(int dim=-1) const
Definition: fCNDArray.cc:452
FloatComplexNDArray cumprod(int dim=-1) const
Definition: fCNDArray.cc:358
FloatComplexNDArray cummin(int dim=-1) const
Definition: fCNDArray.cc:477
FloatComplexNDArray cummax(int dim=-1) const
Definition: fCNDArray.cc:464
FloatComplexNDArray sumsq(int dim=-1) const
Definition: fCNDArray.cc:396
FloatComplexNDArray ifourierNd(void) const
Definition: fCNDArray.cc:175
bool any_element_is_nan(void) const
Definition: fCNDArray.cc:265
boolNDArray isfinite(void) const
Definition: fCNDArray.cc:508
ComplexNDArray dsum(int dim=-1) const
Definition: fCNDArray.cc:390
bool all_elements_are_real(void) const
Definition: fCNDArray.cc:279
FloatComplexNDArray diff(octave_idx_type order=1, int dim=-1) const
Definition: fCNDArray.cc:402
FloatComplexNDArray fourier2d(void) const
Definition: fCNDArray.cc:120
FloatComplexNDArray & insert(const NDArray &a, octave_idx_type r, octave_idx_type c)
Definition: fCNDArray.cc:520
static void increment_index(Array< octave_idx_type > &ra_idx, const dim_vector &dimensions, int start_dimension=0)
Definition: fCNDArray.cc:584
FloatComplexNDArray prod(int dim=-1) const
Definition: fCNDArray.cc:372
FloatComplexNDArray ifourier2d(void) const
Definition: fCNDArray.cc:140
FloatComplexNDArray ifourier(int dim=1) const
Definition: fCNDArray.cc:89
boolNDArray operator!(void) const
Definition: fCNDArray.cc:254
bool any_element_is_inf_or_nan(void) const
Definition: fCNDArray.cc:271
FloatComplexNDArray cumsum(int dim=-1) const
Definition: fCNDArray.cc:365
boolNDArray all(int dim=-1) const
Definition: fCNDArray.cc:346
FloatComplexNDArray(void)
Definition: fCNDArray.h:42
bool too_large_for_float(void) const
Definition: fCNDArray.cc:340
FloatComplexNDArray concat(const FloatComplexNDArray &rb, const Array< octave_idx_type > &ra_idx)
Definition: fCNDArray.cc:408
boolNDArray any(int dim=-1) const
Definition: fCNDArray.cc:352
static octave_idx_type compute_index(Array< octave_idx_type > &ra_idx, const dim_vector &dimensions)
Definition: fCNDArray.cc:592
FloatComplexNDArray diag(octave_idx_type k=0) const
Definition: fCNDArray.cc:599
FloatComplexNDArray fourier(int dim=1) const
Definition: fCNDArray.cc:58
FloatComplexNDArray fourierNd(void) const
Definition: fCNDArray.cc:160
ComplexNDArray dprod(int dim=-1) const
Definition: fCNDArray.cc:378
Template for N-dimensional array classes with like-type math operators.
Definition: MArray.h:63
Vector representing the dimensions (size) of an Array.
Definition: dim-vector.h:95
octave_idx_type ndims(void) const
Number of dimensions.
Definition: dim-vector.h:334
static int fft(const double *in, Complex *out, size_t npts, size_t nsamples=1, octave_idx_type stride=1, octave_idx_type dist=-1)
Definition: oct-fftw.cc:852
static int fftNd(const double *, Complex *, const int, const dim_vector &)
Definition: oct-fftw.cc:916
static int ifftNd(const Complex *, Complex *, const int, const dim_vector &)
Definition: oct-fftw.cc:962
static int ifft(const Complex *in, Complex *out, size_t npts, size_t nsamples=1, octave_idx_type stride=1, octave_idx_type dist=-1)
Definition: oct-fftw.cc:892
std::istream & operator>>(std::istream &is, FloatComplexNDArray &a)
Definition: fCNDArray.cc:626
std::ostream & operator<<(std::ostream &os, const FloatComplexNDArray &a)
Definition: fCNDArray.cc:612
static const FloatComplex FloatComplex_NaN_result(octave::numeric_limits< float >::NaN(), octave::numeric_limits< float >::NaN())
FloatComplexNDArray concat(NDArray &ra, FloatComplexNDArray &rb, const Array< octave_idx_type > &ra_idx)
Definition: fCNDArray.cc:427
FloatComplexNDArray & operator/=(FloatComplexNDArray &a, float s)
Definition: fCNDArray.cc:666
FloatComplexNDArray conj(const FloatComplexNDArray &a)
Definition: fCNDArray.cc:514
OCTAVE_NORETURN liboctave_error_handler current_liboctave_error_handler
Definition: lo-error.c:41
void octave_write_complex(std::ostream &os, const Complex &c)
Definition: lo-utils.cc:400
bool mx_inline_all_finite(size_t n, const T *x)
Definition: mx-inlines.cc:270
void mx_inline_div2(size_t n, R *r, const X *x)
Definition: mx-inlines.cc:129
void mx_inline_any(const T *v, bool *r, octave_idx_type l, octave_idx_type n, octave_idx_type u)
Definition: mx-inlines.cc:851
void mx_inline_cummin(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:1193
void mx_inline_cumprod(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:868
void mx_inline_cumsum(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:867
void mx_inline_not(size_t n, bool *r, const X *x)
Definition: mx-inlines.cc:181
void mx_inline_max(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:972
void mx_inline_all(const T *v, bool *r, octave_idx_type m, octave_idx_type n)
Definition: mx-inlines.cc:817
void mx_inline_prod(const T *v, T *r, octave_idx_type l, octave_idx_type n, octave_idx_type u)
Definition: mx-inlines.cc:847
void mx_inline_cummax(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:1194
void mx_inline_dprod(const T *v, typename subst_template_param< std::complex, T, double >::type *r, octave_idx_type l, octave_idx_type n, octave_idx_type u)
Definition: mx-inlines.cc:848
bool mx_inline_all_real(size_t n, const std::complex< T > *x)
Definition: mx-inlines.cc:309
T mx_inline_sumsq(const T *v, octave_idx_type n)
Definition: mx-inlines.cc:755
bool mx_inline_any_nan(size_t n, const T *x)
Definition: mx-inlines.cc:257
T mx_inline_sum(const T *v, octave_idx_type n)
Definition: mx-inlines.cc:752
void mx_inline_min(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:971
T octave_idx_type m
Definition: mx-inlines.cc:773
void mx_inline_dsum(const T *v, typename subst_template_param< std::complex, T, double >::type *r, octave_idx_type l, octave_idx_type n, octave_idx_type u)
Definition: mx-inlines.cc:845
void mx_inline_diff(const T *v, T *r, octave_idx_type n, octave_idx_type order)
Definition: mx-inlines.cc:1390
octave_idx_type n
Definition: mx-inlines.cc:753
T * r
Definition: mx-inlines.cc:773
void mx_inline_mul2(size_t n, R *r, const X *x)
Definition: mx-inlines.cc:128
void mx_inline_pow(size_t n, R *r, const X *x, const Y *y)
Definition: mx-inlines.cc:414
#define NDND_BOOL_OPS(ND1, ND2)
Definition: mx-op-defs.h:350
#define NDS_BOOL_OPS(ND, S)
Definition: mx-op-defs.h:256
#define NDND_CMP_OPS(ND1, ND2)
Definition: mx-op-defs.h:333
#define SND_BOOL_OPS(S, ND)
Definition: mx-op-defs.h:303
#define NDS_CMP_OPS(ND, S)
Definition: mx-op-defs.h:239
#define SND_CMP_OPS(S, ND)
Definition: mx-op-defs.h:286
#define MINMAX_FCNS(T, S)
Definition: mx-op-defs.h:589
T x_nint(T x)
Definition: lo-mappers.h:262
void err_nan_to_logical_conversion(void)
std::complex< float > FloatComplex
Definition: oct-cmplx.h:34
octave_int< T > pow(const octave_int< T > &a, const octave_int< T > &b)
const octave_base_value const Array< octave_idx_type > & ra_idx
octave_value::octave_value(const Array< char > &chm, char type) return retval
Definition: ov.cc:811