GNU Octave  9.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fNDArray.cc
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (C) 1996-2024 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 <istream>
31 #include <limits>
32 #include <ostream>
33 
34 #include "Array-util.h"
35 #include "f77-fcn.h"
36 #include "fNDArray.h"
37 #include "lo-error.h"
38 #include "lo-ieee.h"
39 #include "lo-mappers.h"
40 #include "mx-base.h"
41 #include "mx-op-defs.h"
42 #include "oct-fftw.h"
43 #include "oct-locbuf.h"
44 
45 #include "bsxfun-defs.cc"
46 
48  : MArray<float> (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 
58 FloatNDArray::fourier (int dim) const
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 float *in (data ());
77  FloatComplexNDArray retval (dv);
78  FloatComplex *out (retval.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 
89 FloatNDArray::ifourier (int dim) const
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  FloatComplexNDArray retval (*this);
108  FloatComplex *out (retval.fortran_vec ());
109 
110  // Need to be careful here about the distance between fft's
111  for (octave_idx_type k = 0; k < nloop; k++)
112  octave::fftw::ifft (out + k * stride * n, out + k * stride * n,
113  n, howmany, stride, dist);
114 
115  return retval;
116 }
117 
120 {
121  dim_vector dv = dims ();
122  if (dv.ndims () < 2)
123  return FloatComplexNDArray ();
124 
125  dim_vector dv2 (dv(0), dv(1));
126  const float *in = data ();
127  FloatComplexNDArray retval (dv);
128  FloatComplex *out = retval.fortran_vec ();
129  octave_idx_type howmany = numel () / dv(0) / dv(1);
130  octave_idx_type dist = dv(0) * dv(1);
131 
132  for (octave_idx_type i=0; i < howmany; i++)
133  octave::fftw::fftNd (in + i*dist, out + i*dist, 2, dv2);
134 
135  return retval;
136 }
137 
140 {
141  dim_vector dv = dims ();
142  if (dv.ndims () < 2)
143  return FloatComplexNDArray ();
144 
145  dim_vector dv2 (dv(0), dv(1));
146  FloatComplexNDArray retval (*this);
147  FloatComplex *out = retval.fortran_vec ();
148  octave_idx_type howmany = numel () / dv(0) / dv(1);
149  octave_idx_type dist = dv(0) * dv(1);
150 
151  for (octave_idx_type i=0; i < howmany; i++)
152  octave::fftw::ifftNd (out + i*dist, out + i*dist, 2, dv2);
153 
154  return retval;
155 }
156 
159 {
160  dim_vector dv = dims ();
161  int rank = dv.ndims ();
162 
163  const float *in (data ());
164  FloatComplexNDArray retval (dv);
165  FloatComplex *out (retval.fortran_vec ());
166 
167  octave::fftw::fftNd (in, out, rank, dv);
168 
169  return retval;
170 }
171 
174 {
175  dim_vector dv = dims ();
176  int rank = dv.ndims ();
177 
178  FloatComplexNDArray tmp (*this);
179  FloatComplex *in (tmp.fortran_vec ());
180  FloatComplexNDArray retval (dv);
181  FloatComplex *out (retval.fortran_vec ());
182 
183  octave::fftw::ifftNd (in, out, rank, dv);
184 
185  return retval;
186 }
187 
188 #else
189 
191 FloatNDArray::fourier (int dim) const
192 {
193  octave_unused_parameter (dim);
194 
195  (*current_liboctave_error_handler)
196  ("support for FFTW was unavailable or disabled when liboctave was built");
197 
198  return FloatComplexNDArray ();
199 }
200 
202 FloatNDArray::ifourier (int dim) const
203 {
204  octave_unused_parameter (dim);
205 
206  (*current_liboctave_error_handler)
207  ("support for FFTW was unavailable or disabled when liboctave was built");
208  return FloatComplexNDArray ();
209 }
210 
213 {
214  (*current_liboctave_error_handler)
215  ("support for FFTW was unavailable or disabled when liboctave was built");
216 
217  return FloatComplexNDArray ();
218 }
219 
222 {
223  (*current_liboctave_error_handler)
224  ("support for FFTW was unavailable or disabled when liboctave was built");
225 
226  return FloatComplexNDArray ();
227 }
228 
231 {
232  (*current_liboctave_error_handler)
233  ("support for FFTW was unavailable or disabled when liboctave was built");
234 
235  return FloatComplexNDArray ();
236 }
237 
240 {
241  (*current_liboctave_error_handler)
242  ("support for FFTW was unavailable or disabled when liboctave was built");
243 
244  return FloatComplexNDArray ();
245 }
246 
247 #endif
248 
249 // unary operations
250 
253 {
254  if (any_element_is_nan ())
256 
257  return do_mx_unary_op<bool, float> (*this, mx_inline_not);
258 }
259 
260 bool
262 {
263  return (neg_zero ? test_all (octave::math::negative_sign)
264  : do_mx_check<float> (*this, mx_inline_any_negative));
265 }
266 
267 bool
269 {
270  return (neg_zero ? test_all (octave::math::positive_sign)
271  : do_mx_check<float> (*this, mx_inline_any_positive));
272 }
273 
274 bool
276 {
277  return do_mx_check<float> (*this, mx_inline_any_nan);
278 }
279 
280 bool
282 {
283  return ! do_mx_check<float> (*this, mx_inline_all_finite);
284 }
285 
286 bool
288 {
289  return ! test_all (octave::is_one_or_zero);
290 }
291 
292 bool
294 {
295  return test_all (octave::is_zero);
296 }
297 
298 bool
300 {
302 }
303 
304 // Return nonzero if any element of M is not an integer. Also extract
305 // the largest and smallest values and return them in MAX_VAL and MIN_VAL.
306 
307 bool
308 FloatNDArray::all_integers (float& max_val, float& min_val) const
309 {
310  octave_idx_type nel = numel ();
311 
312  if (nel > 0)
313  {
314  max_val = elem (0);
315  min_val = elem (0);
316  }
317  else
318  return false;
319 
320  for (octave_idx_type i = 0; i < nel; i++)
321  {
322  float val = elem (i);
323 
324  if (val > max_val)
325  max_val = val;
326 
327  if (val < min_val)
328  min_val = val;
329 
330  if (! octave::math::isinteger (val))
331  return false;
332  }
333 
334  return true;
335 }
336 
337 bool
339 {
341 }
342 
343 bool
345 {
346  return false;
347 }
348 
349 // FIXME: this is not quite the right thing.
350 
352 FloatNDArray::all (int dim) const
353 {
354  return do_mx_red_op<bool, float> (*this, dim, mx_inline_all);
355 }
356 
358 FloatNDArray::any (int dim) const
359 {
360  return do_mx_red_op<bool, float> (*this, dim, mx_inline_any);
361 }
362 
364 FloatNDArray::cumprod (int dim) const
365 {
366  return do_mx_cum_op<float, float> (*this, dim, mx_inline_cumprod);
367 }
368 
370 FloatNDArray::cumsum (int dim) const
371 {
372  return do_mx_cum_op<float, float> (*this, dim, mx_inline_cumsum);
373 }
374 
376 FloatNDArray::prod (int dim) const
377 {
378  return do_mx_red_op<float, float> (*this, dim, mx_inline_prod);
379 }
380 
381 NDArray
382 FloatNDArray::dprod (int dim) const
383 {
384  return do_mx_red_op<double, float> (*this, dim, mx_inline_dprod);
385 }
386 
388 FloatNDArray::sum (int dim) const
389 {
390  return do_mx_red_op<float, float> (*this, dim, mx_inline_sum);
391 }
392 
393 NDArray
394 FloatNDArray::dsum (int dim) const
395 {
396  return do_mx_red_op<double, float> (*this, dim, mx_inline_dsum);
397 }
398 
400 FloatNDArray::sumsq (int dim) const
401 {
402  return do_mx_red_op<float, float> (*this, dim, mx_inline_sumsq);
403 }
404 
406 FloatNDArray::max (int dim) const
407 {
408  return do_mx_minmax_op<float> (*this, dim, mx_inline_max);
409 }
410 
412 FloatNDArray::max (Array<octave_idx_type>& idx_arg, int dim) const
413 {
414  return do_mx_minmax_op<float> (*this, idx_arg, dim, mx_inline_max);
415 }
416 
418 FloatNDArray::min (int dim) const
419 {
420  return do_mx_minmax_op<float> (*this, dim, mx_inline_min);
421 }
422 
424 FloatNDArray::min (Array<octave_idx_type>& idx_arg, int dim) const
425 {
426  return do_mx_minmax_op<float> (*this, idx_arg, dim, mx_inline_min);
427 }
428 
430 FloatNDArray::cummax (int dim) const
431 {
432  return do_mx_cumminmax_op<float> (*this, dim, mx_inline_cummax);
433 }
434 
437 {
438  return do_mx_cumminmax_op<float> (*this, idx_arg, dim, mx_inline_cummax);
439 }
440 
442 FloatNDArray::cummin (int dim) const
443 {
444  return do_mx_cumminmax_op<float> (*this, dim, mx_inline_cummin);
445 }
446 
449 {
450  return do_mx_cumminmax_op<float> (*this, idx_arg, dim, mx_inline_cummin);
451 }
452 
454 FloatNDArray::diff (octave_idx_type order, int dim) const
455 {
456  return do_mx_diff_op<float> (*this, dim, order, mx_inline_diff);
457 }
458 
462 {
463  if (rb.numel () > 0)
464  insert (rb, ra_idx);
465  return *this;
466 }
467 
471 {
472  FloatComplexNDArray retval (*this);
473  if (rb.numel () > 0)
474  retval.insert (rb, ra_idx);
475  return retval;
476 }
477 
481 {
482  charNDArray retval (dims ());
483  octave_idx_type nel = numel ();
484 
485  for (octave_idx_type i = 0; i < nel; i++)
486  {
487  float d = elem (i);
488 
489  if (octave::math::isnan (d))
490  (*current_liboctave_error_handler)
491  ("invalid conversion from NaN to character");
492 
494 
495  if (ival < 0 || ival > std::numeric_limits<unsigned char>::max ())
496  // FIXME: is there something better to do? Should we warn the user?
497  ival = 0;
498 
499  retval.elem (i) = static_cast<char> (ival);
500  }
501 
502  if (rb.isempty ())
503  return retval;
504 
505  retval.insert (rb, ra_idx);
506  return retval;
507 }
508 
511 {
512  return do_mx_unary_op<float, FloatComplex> (a, mx_inline_real);
513 }
514 
517 {
518  return do_mx_unary_op<float, FloatComplex> (a, mx_inline_imag);
519 }
520 
524 {
525  Array<float>::insert (a, r, c);
526  return *this;
527 }
528 
532 {
534  return *this;
535 }
536 
539 {
540  return do_mx_unary_map<float, float, std::abs> (*this);
541 }
542 
545 {
546  return do_mx_unary_map<bool, float, octave::math::isnan> (*this);
547 }
548 
551 {
552  return do_mx_unary_map<bool, float, octave::math::isinf> (*this);
553 }
554 
557 {
558  return do_mx_unary_map<bool, float, octave::math::isfinite> (*this);
559 }
560 
561 void
563  const dim_vector& dimensions,
564  int start_dimension)
565 {
566  ::increment_index (ra_idx, dimensions, start_dimension);
567 }
568 
571  const dim_vector& dimensions)
572 {
573  return ::compute_index (ra_idx, dimensions);
574 }
575 
578 {
579  return MArray<float>::diag (k);
580 }
581 
584 {
585  return MArray<float>::diag (m, n);
586 }
587 
588 // This contains no information on the array structure !!!
589 std::ostream&
590 operator << (std::ostream& os, const FloatNDArray& a)
591 {
592  octave_idx_type nel = a.numel ();
593 
594  for (octave_idx_type i = 0; i < nel; i++)
595  {
596  os << ' ';
597  octave::write_value<float> (os, a.elem (i));
598  os << "\n";
599  }
600  return os;
601 }
602 
603 std::istream&
604 operator >> (std::istream& is, FloatNDArray& a)
605 {
606  octave_idx_type nel = a.numel ();
607 
608  if (nel > 0)
609  {
610  float tmp;
611  for (octave_idx_type i = 0; i < nel; i++)
612  {
613  tmp = octave::read_value<float> (is);
614  if (is)
615  a.elem (i) = tmp;
616  else
617  return is;
618  }
619  }
620 
621  return is;
622 }
623 
625 
628 
631 
634 
637 
octave_idx_type compute_index(octave_idx_type n, const dim_vector &dims)
Definition: Array-util.cc:177
#define BSXFUN_STDREL_DEFS_MXLOOP(ARRAY)
Definition: bsxfun-defs.cc:244
#define BSXFUN_STDOP_DEFS_MXLOOP(ARRAY)
Definition: bsxfun-defs.cc:236
#define BSXFUN_OP2_DEF_MXLOOP(OP, ARRAY, ARRAY1, ARRAY2, LOOP)
Definition: bsxfun-defs.cc:226
#define BSXFUN_OP_DEF_MXLOOP(OP, ARRAY, LOOP)
Definition: bsxfun-defs.cc:221
T & elem(octave_idx_type n)
Size of the specified dimension.
Definition: Array.h:562
T * fortran_vec()
Size of the specified dimension.
Definition: Array-base.cc:1764
bool test_all(F fcn) const
Size of the specified dimension.
Definition: Array.h:922
Array< T, Alloc > & insert(const Array< T, Alloc > &a, const Array< octave_idx_type > &idx)
Insert an array into another at a specified position.
Definition: Array-base.cc:1608
const T * data() const
Size of the specified dimension.
Definition: Array.h:663
bool isempty() const
Size of the specified dimension.
Definition: Array.h:651
const dim_vector & dims() const
Return a const-reference so that dims ()(i) works efficiently.
Definition: Array.h:503
T & xelem(octave_idx_type n)
Size of the specified dimension.
Definition: Array.h:524
Array< T, Alloc > diag(octave_idx_type k=0) const
Get the kth super or subdiagonal.
Definition: Array-base.cc:2541
octave_idx_type numel() const
Number of elements in the array.
Definition: Array.h:414
FloatComplexNDArray & insert(const NDArray &a, octave_idx_type r, octave_idx_type c)
Definition: fCNDArray.cc:520
bool any_element_is_positive(bool=false) const
Definition: fNDArray.cc:268
boolNDArray isfinite() const
Definition: fNDArray.cc:556
static octave_idx_type compute_index(Array< octave_idx_type > &ra_idx, const dim_vector &dimensions)
Definition: fNDArray.cc:570
FloatNDArray sum(int dim=-1) const
Definition: fNDArray.cc:388
FloatNDArray min(int dim=-1) const
Definition: fNDArray.cc:418
FloatComplexNDArray ifourier(int dim=1) const
Definition: fNDArray.cc:89
FloatNDArray prod(int dim=-1) const
Definition: fNDArray.cc:376
bool any_element_not_one_or_zero() const
Definition: fNDArray.cc:287
bool any_element_is_negative(bool=false) const
Definition: fNDArray.cc:261
FloatNDArray abs() const
Definition: fNDArray.cc:538
FloatNDArray cumprod(int dim=-1) const
Definition: fNDArray.cc:364
boolNDArray any(int dim=-1) const
Definition: fNDArray.cc:358
boolNDArray isnan() const
Definition: fNDArray.cc:544
boolNDArray all(int dim=-1) const
Definition: fNDArray.cc:352
FloatNDArray()
Definition: fNDArray.h:43
bool too_large_for_float() const
Definition: fNDArray.cc:344
NDArray dprod(int dim=-1) const
Definition: fNDArray.cc:382
FloatNDArray & insert(const FloatNDArray &a, octave_idx_type r, octave_idx_type c)
Definition: fNDArray.cc:522
bool any_element_is_nan() const
Definition: fNDArray.cc:275
bool all_integers() const
Definition: fNDArray.cc:338
bool any_element_is_inf_or_nan() const
Definition: fNDArray.cc:281
FloatNDArray cummin(int dim=-1) const
Definition: fNDArray.cc:442
bool all_elements_are_zero() const
Definition: fNDArray.cc:293
boolNDArray isinf() const
Definition: fNDArray.cc:550
FloatNDArray cumsum(int dim=-1) const
Definition: fNDArray.cc:370
FloatComplexNDArray ifourier2d() const
Definition: fNDArray.cc:139
NDArray dsum(int dim=-1) const
Definition: fNDArray.cc:394
FloatNDArray concat(const FloatNDArray &rb, const Array< octave_idx_type > &ra_idx)
Definition: fNDArray.cc:460
FloatComplexNDArray fourier2d() const
Definition: fNDArray.cc:119
FloatComplexNDArray fourierNd() const
Definition: fNDArray.cc:158
static void increment_index(Array< octave_idx_type > &ra_idx, const dim_vector &dimensions, int start_dimension=0)
Definition: fNDArray.cc:562
FloatNDArray diff(octave_idx_type order=1, int dim=-1) const
Definition: fNDArray.cc:454
FloatComplexNDArray ifourierNd() const
Definition: fNDArray.cc:173
FloatComplexNDArray fourier(int dim=1) const
Definition: fNDArray.cc:58
boolNDArray operator!() const
Definition: fNDArray.cc:252
FloatNDArray cummax(int dim=-1) const
Definition: fNDArray.cc:430
FloatNDArray sumsq(int dim=-1) const
Definition: fNDArray.cc:400
FloatNDArray max(int dim=-1) const
Definition: fNDArray.cc:406
bool all_elements_are_int_or_inf_or_nan() const
Definition: fNDArray.cc:299
FloatNDArray diag(octave_idx_type k=0) const
Definition: fNDArray.cc:577
friend class FloatComplexNDArray
Definition: fNDArray.h:143
Template for N-dimensional array classes with like-type math operators.
Definition: MArray.h:63
charNDArray & insert(const charNDArray &a, octave_idx_type r, octave_idx_type c)
Definition: chNDArray.cc:166
Vector representing the dimensions (size) of an Array.
Definition: dim-vector.h:94
octave_idx_type ndims() const
Number of dimensions.
Definition: dim-vector.h:257
std::istream & operator>>(std::istream &is, FloatNDArray &a)
Definition: fNDArray.cc:604
FloatNDArray max(float d, const FloatNDArray &m)
Definition: fNDArray.cc:624
FloatNDArray imag(const FloatComplexNDArray &a)
Definition: fNDArray.cc:516
FloatNDArray real(const FloatComplexNDArray &a)
Definition: fNDArray.cc:510
std::ostream & operator<<(std::ostream &os, const FloatNDArray &a)
Definition: fNDArray.cc:590
void err_nan_to_logical_conversion()
octave_idx_type nint_big(double x)
Definition: lo-mappers.cc:188
bool negative_sign(double x)
Definition: lo-mappers.cc:181
bool isinteger(double x)
Definition: lo-mappers.h:225
bool positive_sign(double x)
Definition: lo-mappers.h:62
bool isnan(bool)
Definition: lo-mappers.h:178
F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE * d
bool is_int_or_inf_or_nan(double x)
Definition: lo-utils.cc:50
bool is_one_or_zero(const T &x)
Definition: lo-utils.h:72
bool is_zero(const T &x)
Definition: lo-utils.h:78
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:859
void mx_inline_cummin(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:1201
void mx_inline_cumprod(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:876
void mx_inline_cumsum(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:875
bool mx_inline_any_nan(std::size_t n, const T *x)
Definition: mx-inlines.cc:260
void mx_inline_max(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:980
void mx_inline_not(std::size_t n, bool *r, const X *x)
Definition: mx-inlines.cc:183
void mx_inline_all(const T *v, bool *r, octave_idx_type m, octave_idx_type n)
Definition: mx-inlines.cc:825
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:855
void mx_inline_cummax(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:1202
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:856
void mx_inline_real(std::size_t n, T *r, const std::complex< T > *x)
Definition: mx-inlines.cc:325
T mx_inline_sumsq(const T *v, octave_idx_type n)
Definition: mx-inlines.cc:763
bool mx_inline_any_positive(std::size_t n, const T *x)
Definition: mx-inlines.cc:299
void mx_inline_imag(std::size_t n, T *r, const std::complex< T > *x)
Definition: mx-inlines.cc:333
T mx_inline_sum(const T *v, octave_idx_type n)
Definition: mx-inlines.cc:760
void mx_inline_min(const T *v, T *r, octave_idx_type n)
Definition: mx-inlines.cc:979
T octave_idx_type m
Definition: mx-inlines.cc:781
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:853
void mx_inline_diff(const T *v, T *r, octave_idx_type n, octave_idx_type order)
Definition: mx-inlines.cc:1398
bool mx_inline_all_finite(std::size_t n, const T *x)
Definition: mx-inlines.cc:273
bool mx_inline_any_negative(std::size_t n, const T *x)
Definition: mx-inlines.cc:286
octave_idx_type n
Definition: mx-inlines.cc:761
T * r
Definition: mx-inlines.cc:781
void mx_inline_pow(std::size_t n, R *r, const X *x, const Y *y)
Definition: mx-inlines.cc:419
#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
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