26#if ! defined (octave_mx_inlines_h)
27#define octave_mx_inlines_h 1
47template <
typename R,
typename S>
51 for (std::size_t i = 0; i < n; i++)
55template <
typename R,
typename X>
59 for (std::size_t i = 0; i < n; i++)
67 for (std::size_t i = 0; i < n; i++)
76 for (std::size_t i = 0; i < n; i++)
85 for (std::size_t i = 0; i < n; i++)
89#define DEFMXBINOP(F, OP) \
90 template <typename R, typename X, typename Y> \
91 inline void F (std::size_t n, R *r, const X *x, const Y *y) \
93 for (std::size_t i = 0; i < n; i++) \
94 r[i] = x[i] OP y[i]; \
96 template <typename R, typename X, typename Y> \
97 inline void F (std::size_t n, R *r, const X *x, Y y) \
99 for (std::size_t i = 0; i < n; i++) \
102 template <typename R, typename X, typename Y> \
103 inline void F (std::size_t n, R *r, X x, const Y *y) \
105 for (std::size_t i = 0; i < n; i++) \
114#define DEFMXBINOPEQ(F, OP) \
115 template <typename R, typename X> \
116 inline void F (std::size_t n, R *r, const X *x) \
118 for (std::size_t i = 0; i < n; i++) \
121 template <typename R, typename X> \
122 inline void F (std::size_t n, R *r, X x) \
124 for (std::size_t i = 0; i < n; i++) \
133#define DEFMXCMPOP(F, OP) \
134 template <typename X, typename Y> \
135 inline void F (std::size_t n, bool *r, const X *x, const Y *y) \
137 for (std::size_t i = 0; i < n; i++) \
138 r[i] = x[i] OP y[i]; \
140 template <typename X, typename Y> \
141 inline void F (std::size_t n, bool *r, const X *x, Y y) \
143 for (std::size_t i = 0; i < n; i++) \
146 template <typename X, typename Y> \
147 inline void F (std::size_t n, bool *r, X x, const Y *y) \
149 for (std::size_t i = 0; i < n; i++) \
172 return x.real () != 0 ||
x.imag () != 0;
186 for (std::size_t i = 0; i < n; i++)
193 for (std::size_t i = 0; i < n; i++)
197#define DEFMXBOOLOP(F, NOT1, OP, NOT2) \
198 template <typename X, typename Y> \
199 inline void F (std::size_t n, bool *r, const X *x, const Y *y) \
201 for (std::size_t i = 0; i < n; i++) \
202 r[i] = ((NOT1 logical_value (x[i])) \
203 OP (NOT2 logical_value (y[i]))); \
205 template <typename X, typename Y> \
206 inline void F (std::size_t n, bool *r, const X *x, Y y) \
208 const bool yy = (NOT2 logical_value (y)); \
209 for (std::size_t i = 0; i < n; i++) \
210 r[i] = (NOT1 logical_value (x[i])) OP yy; \
212 template <typename X, typename Y> \
213 inline void F (std::size_t n, bool *r, X x, const Y *y) \
215 const bool xx = (NOT1 logical_value (x)); \
216 for (std::size_t i = 0; i < n; i++) \
217 r[i] = xx OP (NOT2 logical_value (y[i])); \
231 for (std::size_t i = 0; i < n; i++)
239 for (std::size_t i = 0; i < n; i++)
247 for (std::size_t i = 0; i < n; i++)
255 for (std::size_t i = 0; i < n; i++)
263 for (std::size_t i = 0; i < n; i++)
265 if (octave::math::isnan (
x[i]))
276 for (std::size_t i = 0; i < n; i++)
278 if (! octave::math::isfinite (
x[i]))
289 for (std::size_t i = 0; i < n; i++)
302 for (std::size_t i = 0; i < n; i++)
315 for (std::size_t i = 0; i < n; i++)
317 if (
x[i].
imag () != 0)
328 for (std::size_t i = 0; i < n; i++)
336 for (std::size_t i = 0; i < n; i++)
345 for (std::size_t i = 0; i < n; i++)
346 r[i] = octave::math::min (
x[i], y[i]);
353 for (std::size_t i = 0; i < n; i++)
354 r[i] = octave::math::min (
x[i], y[i], nanflag);
360 const bool nanflag,
const bool realabs)
362 for (std::size_t i = 0; i < n; i++)
363 r[i] = octave::math::min (
x[i], y[i], nanflag, realabs);
370 for (std::size_t i = 0; i < n; i++)
371 r[i] = octave::math::min (
x[i], y);
378 for (std::size_t i = 0; i < n; i++)
379 r[i] = octave::math::min (
x[i], y, nanflag);
385 const bool nanflag,
const bool realabs)
387 for (std::size_t i = 0; i < n; i++)
388 r[i] = octave::math::min (
x[i], y, nanflag, realabs);
395 for (std::size_t i = 0; i < n; i++)
396 r[i] = octave::math::min (
x, y[i]);
403 for (std::size_t i = 0; i < n; i++)
404 r[i] = octave::math::min (
x, y[i], nanflag);
410 const bool nanflag,
const bool realabs)
412 for (std::size_t i = 0; i < n; i++)
413 r[i] = octave::math::min (
x, y[i], nanflag, realabs);
420 for (std::size_t i = 0; i < n; i++)
421 r[i] = octave::math::max (
x[i], y[i]);
428 for (std::size_t i = 0; i < n; i++)
429 r[i] = octave::math::max (
x[i], y[i], nanflag);
435 const bool nanflag,
const bool realabs)
437 for (std::size_t i = 0; i < n; i++)
438 r[i] = octave::math::max (
x[i], y[i], nanflag, realabs);
445 for (std::size_t i = 0; i < n; i++)
446 r[i] = octave::math::max (
x[i], y);
453 for (std::size_t i = 0; i < n; i++)
454 r[i] = octave::math::max (
x[i], y, nanflag);
460 const bool nanflag,
const bool realabs)
462 for (std::size_t i = 0; i < n; i++)
463 r[i] = octave::math::max (
x[i], y, nanflag, realabs);
470 for (std::size_t i = 0; i < n; i++)
471 r[i] = octave::math::max (
x, y[i]);
478 for (std::size_t i = 0; i < n; i++)
479 r[i] = octave::math::max (
x, y[i], nanflag);
485 const bool nanflag,
const bool realabs)
487 for (std::size_t i = 0; i < n; i++)
488 r[i] = octave::math::max (
x, y[i], nanflag, realabs);
495template <
typename R,
typename X,
typename Y>
501 for (std::size_t i = 0; i < n; i++)
502 r[i] =
pow (
x[i], y[i]);
505template <
typename R,
typename X,
typename Y>
511 for (std::size_t i = 0; i < n; i++)
512 r[i] =
pow (
x[i], y);
515template <
typename R,
typename X,
typename Y>
521 for (std::size_t i = 0; i < n; i++)
522 r[i] =
pow (
x, y[i]);
527template <
typename R,
typename X, R fcn (X x)>
531 for (std::size_t i = 0; i < n; i++)
535template <
typename R,
typename X, R fcn (const X& x)>
539 for (std::size_t i = 0; i < n; i++)
546template <
typename R,
typename X>
549 void (*op) (std::size_t, R *,
const X *))
558template <
typename R,
typename X, R fcn (X)>
562 return do_mx_unary_op<R, X> (
x, mx_inline_map<R, X, fcn>);
565template <
typename R,
typename X, R fcn (const X&)>
569 return do_mx_unary_op<R, X> (
x, mx_inline_map<R, X, fcn>);
575 void (*op) (std::size_t, R *))
581template <
typename R,
typename X,
typename Y>
584 void (*op) (std::size_t, R *,
const X *,
const Y *),
585 void (*op1) (std::size_t, R *, X,
const Y *),
586 void (*op2) (std::size_t, R *,
const X *, Y),
602 octave::err_nonconformant (opname, dx, dy);
605template <
typename R,
typename X,
typename Y>
608 void (*op) (std::size_t, R *,
const X *, Y))
615template <
typename R,
typename X,
typename Y>
618 void (*op) (std::size_t, R *, X,
const Y *))
628template <
typename R,
typename X,
typename Y>
631 void (*op) (std::size_t, R *,
const X *,
const Y *,
bool),
632 void (*op1) (std::size_t, R *, X,
const Y *,
bool),
633 void (*op2) (std::size_t, R *,
const X *, Y,
bool),
649 octave::err_nonconformant (opname, dx, dy);
652template <
typename R,
typename X,
typename Y>
655 void (*op) (std::size_t, R *,
const X *, Y,
bool))
662template <
typename R,
typename X,
typename Y>
665 void (*op) (std::size_t, R *, X,
const Y *,
bool))
672template <
typename R,
typename X,
typename Y>
675 bool nanflag,
bool realabs,
676 void (*op) (std::size_t, R *,
const X *,
const Y *,
678 void (*op1) (std::size_t, R *, X,
const Y *,
bool,
bool),
679 void (*op2) (std::size_t, R *,
const X *, Y,
bool,
bool),
695 octave::err_nonconformant (opname, dx, dy);
698template <
typename R,
typename X,
typename Y>
701 void (*op) (std::size_t, R *,
const X *, Y,
bool,
bool))
704 op (r.
numel (), r.
rwdata (),
x.data (), y, nanflag, realabs);
708template <
typename R,
typename X,
typename Y>
711 void (*op) (std::size_t, R *, X,
const Y *,
bool,
bool))
718template <
typename R,
typename X>
721 void (*op) (std::size_t, R *,
const X *),
722 void (*op1) (std::size_t, R *, X),
732 octave::err_nonconformant (opname, dr, dx);
737template <
typename R,
typename X>
740 void (*op) (std::size_t, R *, X))
746template <
typename T1,
typename T2>
750 for (std::size_t i = 0; i < n; i++)
759 bool (*op) (std::size_t,
const T *))
770 return c.real () * c.real () + c.imag () * c.imag ();
807 return ! octave::math::isnan (
x) &&
x != 0.0;
819 return ! octave::math::isnan (
x) &&
x != 0.0f;
832 return ! octave::math::isnan (
x) &&
x != 0.0;
844 return ! octave::math::isnan (
x) &&
x != 0.0f;
853#define OP_RED_SUM(ac, el) ac += el
854#define OP_RED_PROD(ac, el) ac *= el
855#define OP_RED_SUMSQ(ac, el) ac += ((el)*(el))
856#define OP_RED_SUMSQC(ac, el) ac += cabsq (el)
899#define OP_RED_ANYC(ac, el) \
908#define OP_RED_ALLC(ac, el) \
909 if (xis_false (el)) \
917#define OP_RED_FCN(F, TSRC, TRES, OP, ZERO) \
918 template <typename T> \
920 F (const TSRC *v, octave_idx_type n) \
923 for (octave_idx_type i = 0; i < n; i++) \
928#define PROMOTE_DOUBLE(T) \
929 typename subst_template_param<std::complex, T, double>::type
943#define OP_RED_NAN_FCN(F, TSRC, TRES, OP, ZERO) \
944 template <typename T> \
946 F (const TSRC *v, octave_idx_type n, bool nanflag) \
951 for (octave_idx_type i = 0; i < n; i++) \
952 if (! octave::math::isnan (v[i])) \
957 for (octave_idx_type i = 0; i < n; i++) \
972#define OP_RED_FCN2(F, TSRC, TRES, OP, ZERO) \
973 template <typename T> \
975 F (const TSRC *v, TRES *r, octave_idx_type m, octave_idx_type n) \
977 for (octave_idx_type i = 0; i < m; i++) \
979 for (octave_idx_type j = 0; j < n; j++) \
981 for (octave_idx_type i = 0; i < m; i++) \
997#define OP_RED_NAN_FCN2(F, TSRC, TRES, OP, ZERO) \
998 template <typename T> \
1000 F (const TSRC *v, TRES *r, octave_idx_type m, octave_idx_type n, \
1003 for (octave_idx_type i = 0; i < m; i++) \
1009 for (octave_idx_type j = 0; j < n; j++) \
1011 for (octave_idx_type i = 0; i < m; i++) \
1012 if (! octave::math::isnan (v[i])) \
1020 for (octave_idx_type j = 0; j < n; j++) \
1022 for (octave_idx_type i = 0; i < m; i++) \
1038#define OP_RED_ANYR(ac, el) ac |= xis_true (el)
1039#define OP_RED_ALLR(ac, el) ac &= xis_true (el)
1049#define OP_ROW_SHORT_CIRCUIT(F, PRED, ZERO) \
1050 template <typename T> \
1052 F (const T *v, bool *r, octave_idx_type m, octave_idx_type n) \
1055 return F ## _r (v, r, m, n); \
1058 OCTAVE_LOCAL_BUFFER (octave_idx_type, iact, m); \
1059 for (octave_idx_type i = 0; i < m; i++) iact[i] = i; \
1060 octave_idx_type nact = m; \
1061 for (octave_idx_type j = 0; j < n; j++) \
1063 octave_idx_type k = 0; \
1064 for (octave_idx_type i = 0; i < nact; i++) \
1066 octave_idx_type ia = iact[i]; \
1067 if (! PRED (v[ia])) \
1073 for (octave_idx_type i = 0; i < m; i++) r[i] = ! ZERO; \
1074 for (octave_idx_type i = 0; i < nact; i++) r[iact[i]] = ZERO; \
1080#define OP_RED_FCNN(F, TSRC, TRES) \
1081 template <typename T> \
1083 F (const TSRC *v, TRES *r, octave_idx_type l, \
1084 octave_idx_type n, octave_idx_type u) \
1088 for (octave_idx_type i = 0; i < u; i++) \
1090 r[i] = F<T> (v, n); \
1096 for (octave_idx_type i = 0; i < u; i++) \
1117#define OP_RED_NAN_FCNN(F, TSRC, TRES) \
1118 template <typename T> \
1120 F (const TSRC *v, TRES *r, octave_idx_type l, \
1121 octave_idx_type n, octave_idx_type u, bool nanflag) \
1125 for (octave_idx_type i = 0; i < u; i++) \
1127 r[i] = F<T> (v, n, nanflag); \
1133 for (octave_idx_type i = 0; i < u; i++) \
1135 F (v, r, l, n, nanflag); \
1151#define OP_CUM_FCN(F, TSRC, TRES, OP) \
1152 template <typename T> \
1154 F (const TSRC *v, TRES *r, octave_idx_type n) \
1158 TRES t = r[0] = v[0]; \
1159 for (octave_idx_type i = 1; i < n; i++) \
1160 r[i] = t = t OP v[i]; \
1168#define OP_CUM_NAN_FCN(F, TSRC, TRES, OP, ZERO) \
1169 template <typename T> \
1171 F (const TSRC *v, TRES *r, octave_idx_type n, bool nanflag) \
1179 if (octave::math::isnan (v[0])) \
1183 for (octave_idx_type i = 1; i < n; i++) \
1185 if (octave::math::isnan (v[i])) \
1186 r[i] = t = t OP z; \
1188 r[i] = t = t OP v[i]; \
1193 TRES t = r[0] = v[0]; \
1194 for (octave_idx_type i = 1; i < n; i++) \
1195 r[i] = t = t OP v[i]; \
1203#define OP_CUM_FCN2(F, TSRC, TRES, OP) \
1204 template <typename T> \
1206 F (const TSRC *v, TRES *r, octave_idx_type m, octave_idx_type n) \
1210 for (octave_idx_type i = 0; i < m; i++) \
1213 for (octave_idx_type j = 1; j < n; j++) \
1216 for (octave_idx_type i = 0; i < m; i++) \
1217 r[i] = r0[i] OP v[i]; \
1227#define OP_CUM_NAN_FCN2(F, TSRC, TRES, OP, ZERO) \
1228 template <typename T> \
1230 F (const TSRC *v, TRES *r, octave_idx_type m, octave_idx_type n, \
1238 for (octave_idx_type i = 0; i < m; i++) \
1240 if (octave::math::isnan (v[i])) \
1246 for (octave_idx_type j = 1; j < n; j++) \
1249 for (octave_idx_type i = 0; i < m; i++) \
1251 if (octave::math::isnan (v[i])) \
1252 r[i] = r0[i] OP z; \
1254 r[i] = r0[i] OP v[i]; \
1261 for (octave_idx_type i = 0; i < m; i++) \
1264 for (octave_idx_type j = 1; j < n; j++) \
1267 for (octave_idx_type i = 0; i < m; i++) \
1268 r[i] = r0[i] OP v[i]; \
1278#define OP_CUM_FCNN(F, TSRC, TRES) \
1279 template <typename T> \
1281 F (const TSRC *v, TRES *r, octave_idx_type l, \
1282 octave_idx_type n, octave_idx_type u) \
1286 for (octave_idx_type i = 0; i < u; i++) \
1295 for (octave_idx_type i = 0; i < u; i++) \
1308#define OP_CUM_NAN_FCNN(F, TSRC, TRES) \
1309 template <typename T> \
1311 F (const TSRC *v, TRES *r, octave_idx_type l, \
1312 octave_idx_type n, octave_idx_type u, bool nanflag) \
1316 for (octave_idx_type i = 0; i < u; i++) \
1318 F (v, r, n, nanflag); \
1325 for (octave_idx_type i = 0; i < u; i++) \
1327 F (v, r, l, n, nanflag); \
1337template <typename T>
1348template <
typename T>
1357 r[(n-1-j)*m+i] = v[j*m+i];
1362template <
typename T>
1389#define OP_MINMAX_FCN(F, OP) \
1390 template <typename T> \
1391 void F (const T *v, T *r, octave_idx_type n, const bool nanflag, \
1392 const bool realabs) \
1398 for (octave_idx_type i = 0; i < n; i++) \
1399 if (octave::math::isnan (v[i])) \
1406 octave_idx_type i = 1; \
1407 if (octave::math::isnan (tmp)) \
1409 for (; i < n && octave::math::isnan (v[i]); i++) ; \
1415 for (; i < n; i++) \
1421 for (; i < n; i++) \
1423 if (std::abs (v[i]) OP std::abs (tmp)) \
1425 else if (std::abs (v[i]) == std::abs (tmp) && v[i] OP tmp) \
1431 template <typename T> \
1432 void F (const T *v, T *r, octave_idx_type *ri, octave_idx_type n, \
1433 const bool nanflag, const bool realabs) \
1439 for (octave_idx_type i = 0; i < n; i++) \
1440 if (octave::math::isnan (v[i])) \
1448 octave_idx_type tmpi = 0; \
1449 octave_idx_type i = 1; \
1450 if (octave::math::isnan (tmp)) \
1452 for (; i < n && octave::math::isnan (v[i]); i++) ; \
1461 for (; i < n; i++) \
1470 for (; i < n; i++) \
1472 if (std::abs (v[i]) OP std::abs (tmp)) \
1477 else if (std::abs (v[i]) == std::abs (tmp) && v[i] OP tmp) \
1495#define OP_MINMAX_FCN2(F, OP) \
1496 template <typename T> \
1498 F (const T *v, T *r, octave_idx_type m, octave_idx_type n, \
1499 const bool nanflag, const bool realabs) \
1503 octave_idx_type j = 0; \
1504 for (octave_idx_type i = 0; i < m; i++) \
1514 for (octave_idx_type i = 0; i < m; i++) \
1516 if ((octave::math::isnan (v[i]) || \
1517 octave::math::isnan (r[i])) && ! nanflag) \
1519 else if (octave::math::isnan (v[i])); \
1520 else if (octave::math::isnan (r[i]) || v[i] OP r[i]) \
1531 for (octave_idx_type i = 0; i < m; i++) \
1533 if ((octave::math::isnan (v[i]) || \
1534 octave::math::isnan (r[i])) && ! nanflag) \
1536 else if (octave::math::isnan (v[i])); \
1537 else if (octave::math::isnan (r[i]) || \
1538 std::abs (v[i]) OP std::abs (r[i])) \
1540 else if (std::abs (v[i]) == std::abs (r[i]) && \
1549 template <typename T> \
1551 F (const T *v, T *r, octave_idx_type *ri, octave_idx_type m, \
1552 octave_idx_type n, const bool nanflag, const bool realabs) \
1556 octave_idx_type j = 0; \
1557 for (octave_idx_type i = 0; i < m; i++) \
1568 for (octave_idx_type i = 0; i < m; i++) \
1570 if (octave::math::isnan (r[i]) && ! nanflag); \
1571 else if (octave::math::isnan (v[i]) && ! nanflag) \
1576 else if (octave::math::isnan (v[i])); \
1577 else if (octave::math::isnan (r[i]) || v[i] OP r[i]) \
1591 for (octave_idx_type i = 0; i < m; i++) \
1593 if (octave::math::isnan (r[i]) && ! nanflag); \
1594 else if (octave::math::isnan (v[i]) && ! nanflag) \
1599 else if (octave::math::isnan (v[i])); \
1600 else if (octave::math::isnan (r[i]) || \
1601 std::abs (v[i]) OP std::abs (r[i])) \
1606 else if (std::abs (v[i]) == std::abs (r[i]) && \
1622#define OP_MINMAX_FCNN(F) \
1623 template <typename T> \
1625 F (const T *v, T *r, octave_idx_type l, octave_idx_type n, \
1626 octave_idx_type u, const bool nanflag, const bool realabs) \
1632 for (octave_idx_type i = 0; i < u; i++) \
1634 F (v, r, n, nanflag, realabs); \
1641 for (octave_idx_type i = 0; i < u; i++) \
1643 F (v, r, l, n, nanflag, realabs); \
1649 template <typename T> \
1651 F (const T *v, T *r, octave_idx_type *ri, octave_idx_type l, \
1652 octave_idx_type n, octave_idx_type u, const bool nanflag, \
1653 const bool realabs) \
1658 for (octave_idx_type i = 0; i < u; i++) \
1660 F (v, r, ri, n, nanflag, realabs); \
1668 for (octave_idx_type i = 0; i < u; i++) \
1670 F (v, r, ri, l, n, nanflag, realabs); \
1684#define OP_CMINMAX_FCN(F, OP) \
1685 template <typename T> \
1686 void F (const std::complex<T> *v, std::complex<T> *r, \
1687 octave_idx_type n, const bool nanflag, const bool realabs) \
1693 for (octave_idx_type i = 0; i < n; i++) \
1694 if (octave::math::isnan (v[i])) \
1700 std::complex<T> tmp = v[0]; \
1701 octave_idx_type i = 1; \
1702 if (octave::math::isnan (tmp)) \
1704 for (; i < n && octave::math::isnan (v[i]); i++) ; \
1710 for (; i < n; i++) \
1712 if (v[i].real () OP tmp.real ()) \
1714 else if (v[i].real () == tmp.real () && \
1715 v[i].imag () OP tmp.imag ()) \
1721 for (; i < n; i++) \
1723 if (std::abs (v[i]) OP std::abs (tmp)) \
1725 else if (std::abs (v[i]) == std::abs (tmp) && \
1726 std::arg (v[i]) OP std::arg (tmp)) \
1732 template <typename T> \
1733 void F (const std::complex<T> *v, std::complex<T> *r, \
1734 octave_idx_type *ri, octave_idx_type n, const bool nanflag, \
1735 const bool realabs) \
1741 for (octave_idx_type i = 0; i < n; i++) \
1742 if (octave::math::isnan (v[i])) \
1749 std::complex<T> tmp = v[0]; \
1750 octave_idx_type tmpi = 0; \
1751 octave_idx_type i = 1; \
1752 if (octave::math::isnan (tmp)) \
1754 for (; i < n && octave::math::isnan (v[i]); i++) ; \
1763 for (; i < n; i++) \
1765 if (v[i].real () OP tmp.real ()) \
1770 else if (v[i].real () == tmp.real () && \
1771 v[i].imag () OP tmp.imag ()) \
1780 for (; i < n; i++) \
1782 if (std::abs (v[i]) OP std::abs (tmp)) \
1787 else if (std::abs (v[i]) == std::abs (tmp) && \
1788 std::arg (v[i]) OP std::arg (tmp)) \
1806#define OP_CMINMAX_FCN2(F, OP) \
1807 template <typename T> \
1809 F (const std::complex<T> *v, std::complex<T> *r, octave_idx_type m, \
1810 octave_idx_type n, const bool nanflag, const bool realabs) \
1814 octave_idx_type j = 0; \
1815 for (octave_idx_type i = 0; i < m; i++) \
1825 for (octave_idx_type i = 0; i < m; i++) \
1827 if ((octave::math::isnan (v[i]) || \
1828 octave::math::isnan (r[i])) && ! nanflag) \
1830 else if (octave::math::isnan (v[i])); \
1831 else if (octave::math::isnan (r[i]) || \
1832 v[i].real () OP r[i].real ()) \
1834 else if (v[i].real () == r[i].real () && \
1835 v[i].imag () OP r[i].imag ()) \
1846 for (octave_idx_type i = 0; i < m; i++) \
1848 if ((octave::math::isnan (v[i]) || \
1849 octave::math::isnan (r[i])) && ! nanflag) \
1851 else if (octave::math::isnan (v[i])); \
1852 else if (octave::math::isnan (r[i]) || \
1853 std::abs (v[i]) OP std::abs (r[i])) \
1855 else if (std::abs (v[i]) == std::abs (r[i]) && \
1856 std::arg (v[i]) OP std::arg (r[i])) \
1864 template <typename T> \
1866 F (const std::complex<T> *v, std::complex<T> *r, octave_idx_type *ri, \
1867 octave_idx_type m, octave_idx_type n, const bool nanflag, \
1868 const bool realabs) \
1872 octave_idx_type j = 0; \
1873 for (octave_idx_type i = 0; i < m; i++) \
1884 for (octave_idx_type i = 0; i < m; i++) \
1886 if (octave::math::isnan (r[i]) && ! nanflag); \
1887 else if (octave::math::isnan (v[i]) && ! nanflag) \
1892 else if (octave::math::isnan (v[i])); \
1893 else if (octave::math::isnan (r[i]) || \
1894 v[i].real () OP r[i].real ()) \
1899 else if (v[i].real () == r[i].real () && \
1900 v[i].imag () OP r[i].imag ()) \
1914 for (octave_idx_type i = 0; i < m; i++) \
1916 if (octave::math::isnan (r[i]) && ! nanflag); \
1917 else if (octave::math::isnan (v[i]) && ! nanflag) \
1922 else if (octave::math::isnan (v[i])); \
1923 else if (octave::math::isnan (r[i]) || \
1924 std::abs (v[i]) OP std::abs (r[i])) \
1929 else if (std::abs (v[i]) == std::abs (r[i]) && \
1930 std::arg (v[i]) OP std::arg (r[i])) \
1945#define OP_CMINMAX_FCNN(F) \
1946 template <typename T> \
1948 F (const T *v, T *r, octave_idx_type l, octave_idx_type n, \
1949 octave_idx_type u, const bool nanflag, const bool realabs) \
1955 for (octave_idx_type i = 0; i < u; i++) \
1957 F (v, r, n, nanflag, realabs); \
1964 for (octave_idx_type i = 0; i < u; i++) \
1966 F (v, r, l, n, nanflag, realabs); \
1972 template <typename T> \
1974 F (const T *v, T *r, octave_idx_type *ri, octave_idx_type l, \
1975 octave_idx_type n, octave_idx_type u, bool nanflag, bool realabs) \
1980 for (octave_idx_type i = 0; i < u; i++) \
1982 F (v, r, ri, n, nanflag, realabs); \
1990 for (octave_idx_type i = 0; i < u; i++) \
1992 F (v, r, ri, l, n, nanflag, realabs); \
2006#define OP_INT_MINMAX_FCN(F, OP) \
2007 template <typename T> \
2008 void F (const T *v, T *r, octave_idx_type n, const bool realabs) \
2013 octave_idx_type i = 1; \
2016 for (; i < n; i++) \
2022 for (; i < n; i++) \
2024 if (mappers_abs (v[i]) OP mappers_abs (tmp)) \
2026 else if (mappers_abs (v[i]) == mappers_abs (tmp) && \
2033 template <typename T> \
2034 void F (const T *v, T *r, octave_idx_type *ri, octave_idx_type n, \
2035 const bool realabs) \
2040 octave_idx_type tmpi = 0; \
2041 octave_idx_type i = 1; \
2044 for (; i < n; i++) \
2053 for (; i < n; i++) \
2055 if (mappers_abs (v[i]) OP mappers_abs (tmp)) \
2060 else if (mappers_abs (v[i]) == mappers_abs (tmp) && \
2075#define OP_INT_MINMAX_FCN2(F, OP) \
2076 template <typename T> \
2078 F (const T *v, T *r, octave_idx_type m, octave_idx_type n, \
2079 const bool realabs) \
2083 octave_idx_type j = 0; \
2084 for (octave_idx_type i = 0; i < m; i++) \
2094 for (octave_idx_type i = 0; i < m; i++) \
2105 for (octave_idx_type i = 0; i < m; i++) \
2107 if (mappers_abs (v[i]) OP mappers_abs (r[i])) \
2109 else if (mappers_abs (v[i]) == mappers_abs (r[i]) && \
2118 template <typename T> \
2120 F (const T *v, T *r, octave_idx_type *ri, octave_idx_type m, \
2121 octave_idx_type n, const bool realabs) \
2125 octave_idx_type j = 0; \
2126 for (octave_idx_type i = 0; i < m; i++) \
2137 for (octave_idx_type i = 0; i < m; i++) \
2151 for (octave_idx_type i = 0; i < m; i++) \
2153 if (mappers_abs (v[i]) OP mappers_abs (r[i])) \
2158 else if (mappers_abs (v[i]) == mappers_abs (r[i]) && \
2174#define OP_INT_MINMAX_FCNN(F) \
2175 template <typename T> \
2177 F (const T *v, T *r, octave_idx_type l, octave_idx_type n, \
2178 octave_idx_type u, const bool realabs) \
2184 for (octave_idx_type i = 0; i < u; i++) \
2186 F (v, r, n, realabs); \
2193 for (octave_idx_type i = 0; i < u; i++) \
2195 F (v, r, l, n, realabs); \
2201 template <typename T> \
2203 F (const T *v, T *r, octave_idx_type *ri, octave_idx_type l, \
2204 octave_idx_type n, octave_idx_type u, const bool realabs) \
2209 for (octave_idx_type i = 0; i < u; i++) \
2211 F (v, r, ri, n, realabs); \
2219 for (octave_idx_type i = 0; i < u; i++) \
2221 F (v, r, ri, l, n, realabs); \
2235#define OP_CHMINMAX_FCN(F, OP) \
2236 template <typename T> \
2237 void F (const T *v, T *r, octave_idx_type n) \
2242 octave_idx_type i = 1; \
2243 for (; i < n; i++) \
2248 template <typename T> \
2249 void F (const T *v, T *r, octave_idx_type *ri, octave_idx_type n) \
2254 octave_idx_type tmpi = 0; \
2255 octave_idx_type i = 1; \
2256 for (; i < n; i++) \
2269#define OP_CHMINMAX_FCN2(F, OP) \
2270 template <typename T> \
2272 F (const T *v, T *r, octave_idx_type m, octave_idx_type n) \
2276 octave_idx_type j = 1; \
2277 for (octave_idx_type i = 0; i < m; i++) \
2282 for (octave_idx_type i = 0; i < m; i++) \
2289 template <typename T> \
2291 F (const T *v, T *r, octave_idx_type *ri, \
2292 octave_idx_type m, octave_idx_type n) \
2296 octave_idx_type j = 1; \
2297 for (octave_idx_type i = 0; i < m; i++) \
2305 for (octave_idx_type i = 0; i < m; i++) \
2319#define OP_CHMINMAX_FCNN(F) \
2320 template <typename T> \
2322 F (const T *v, T *r, octave_idx_type l, \
2323 octave_idx_type n,octave_idx_type u) \
2329 for (octave_idx_type i = 0; i < u; i++) \
2338 for (octave_idx_type i = 0; i < u; i++) \
2346 template <typename T> \
2348 F (const T *v, T *r, octave_idx_type *ri, octave_idx_type l, \
2349 octave_idx_type n, octave_idx_type u) \
2354 for (octave_idx_type i = 0; i < u; i++) \
2364 for (octave_idx_type i = 0; i < u; i++) \
2366 F (v, r, ri, l, n); \
2379#define OP_CUMMINMAX_FCN(F, OP) \
2380 template <typename T> \
2381 void F (const T *v, T *r, octave_idx_type n, const bool nanflag, \
2382 const bool realabs) \
2387 octave_idx_type i = 1; \
2388 octave_idx_type j = 0; \
2389 if (octave::math::isnan (tmp) && ! nanflag) \
2391 for (; j < n; j++) \
2395 else if (octave::math::isnan (tmp)) \
2397 for (; i < n && octave::math::isnan (v[i]); i++) ; \
2398 for (; j < i; j++) \
2405 for (; i < n; i++) \
2407 if (octave::math::isnan (v[i]) && ! nanflag) \
2409 for (; j < i; j++) \
2411 for (; j < n; j++) \
2417 for (; j < i; j++) \
2425 for (; i < n; i++) \
2427 if (octave::math::isnan (v[i]) && ! nanflag) \
2429 for (; j < i; j++) \
2431 for (; j < n; j++) \
2435 if (std::abs (v[i]) OP std::abs (tmp)) \
2437 for (; j < i; j++) \
2441 else if (std::abs (v[i]) == std::abs (tmp) && v[i] OP tmp) \
2443 for (; j < i; j++) \
2449 for (; j < i; j++) \
2452 template <typename T> \
2453 void F (const T *v, T *r, octave_idx_type *ri, octave_idx_type n, \
2454 const bool nanflag, const bool realabs) \
2459 octave_idx_type tmpi = 0; \
2460 octave_idx_type i = 1; \
2461 octave_idx_type j = 0; \
2462 if (octave::math::isnan (tmp) && ! nanflag) \
2464 for (; j < n; j++) \
2471 else if (octave::math::isnan (tmp)) \
2473 for (; i < n && octave::math::isnan (v[i]); i++) ; \
2474 for (; j < i; j++) \
2487 for (; i < n; i++) \
2489 if (octave::math::isnan (v[i]) && ! nanflag) \
2491 for (; j < i; j++) \
2496 for (; j < n; j++) \
2505 for (; j < i; j++) \
2517 for (; i < n; i++) \
2519 if (octave::math::isnan (v[i]) && ! nanflag) \
2521 for (; j < i; j++) \
2526 for (; j < n; j++) \
2533 if (std::abs (v[i]) OP std::abs (tmp)) \
2535 for (; j < i; j++) \
2543 else if (std::abs (v[i]) == std::abs (tmp) && v[i] OP tmp) \
2545 for (; j < i; j++) \
2555 for (; j < i; j++) \
2565#define OP_CUMMINMAX_FCN2(F, OP) \
2566 template <typename T> \
2568 F (const T *v, T *r, octave_idx_type m, octave_idx_type n, \
2569 const bool nanflag, const bool realabs) \
2574 octave_idx_type j = 0; \
2575 for (octave_idx_type i = 0; i < m; i++) \
2583 while (! nanflag && j < n) \
2585 for (octave_idx_type i = 0; i < m; i++) \
2587 if (octave::math::isnan (v[i]) || \
2588 octave::math::isnan (r0[i])) \
2590 else if (v[i] OP r0[i]) \
2600 while (nanflag && j < n) \
2602 for (octave_idx_type i = 0; i < m; i++) \
2604 if (octave::math::isnan (r0[i]) || v[i] OP r0[i]) \
2617 while (! nanflag && j < n) \
2619 for (octave_idx_type i = 0; i < m; i++) \
2621 if (octave::math::isnan (v[i]) || \
2622 octave::math::isnan (r0[i])) \
2624 else if (std::abs (v[i]) OP std::abs (r0[i])) \
2626 else if (std::abs (v[i]) == std::abs (r0[i]) && \
2637 while (nanflag && j < n) \
2639 for (octave_idx_type i = 0; i < m; i++) \
2641 if (octave::math::isnan (r0[i])) \
2643 else if (std::abs (v[i]) OP std::abs (r0[i])) \
2645 else if (std::abs (v[i]) == std::abs (r0[i]) && \
2658 template <typename T> \
2660 F (const T *v, T *r, octave_idx_type *ri, octave_idx_type m, \
2661 octave_idx_type n, const bool nanflag, const bool realabs) \
2666 const octave_idx_type *r0i; \
2667 octave_idx_type j = 0; \
2668 for (octave_idx_type i = 0; i < m; i++) \
2681 while (! nanflag && j < n) \
2683 for (octave_idx_type i = 0; i < m; i++) \
2685 if (octave::math::isnan (v[i]) && \
2686 octave::math::isnan (r0[i])) \
2691 else if (octave::math::isnan (v[i])) \
2696 else if (v[i] OP r0[i]) \
2714 while (nanflag && j < n) \
2716 for (octave_idx_type i = 0; i < m; i++) \
2718 if (octave::math::isnan (r0[i]) && \
2719 octave::math::isnan (v[i])) \
2724 else if (octave::math::isnan (r0[i]) || v[i] OP r0[i]) \
2745 while (! nanflag && j < n) \
2747 for (octave_idx_type i = 0; i < m; i++) \
2749 if (octave::math::isnan (v[i]) && \
2750 octave::math::isnan (r0[i])) \
2755 else if (octave::math::isnan (v[i])) \
2760 else if (std::abs (v[i]) OP std::abs (r0[i])) \
2765 else if (std::abs (v[i]) == std::abs (r0[i]) && \
2784 while (nanflag && j < n) \
2786 for (octave_idx_type i = 0; i < m; i++) \
2788 if (octave::math::isnan (r0[i]) && \
2789 octave::math::isnan (v[i])) \
2794 if (octave::math::isnan (r0[i])) \
2799 else if (std::abs (v[i]) OP std::abs (r0[i])) \
2804 else if (std::abs (v[i]) == std::abs (r0[i]) && \
2829#define OP_CUMMINMAX_FCNN(F) \
2830 template <typename T> \
2832 F (const T *v, T *r, octave_idx_type l, octave_idx_type n, \
2833 octave_idx_type u, const bool nanflag, const bool realabs) \
2839 for (octave_idx_type i = 0; i < u; i++) \
2841 F (v, r, n, nanflag, realabs); \
2848 for (octave_idx_type i = 0; i < u; i++) \
2850 F (v, r, l, n, nanflag, realabs); \
2856 template <typename T> \
2858 F (const T *v, T *r, octave_idx_type *ri, octave_idx_type l, \
2859 octave_idx_type n, octave_idx_type u, const bool nanflag, \
2860 const bool realabs) \
2866 for (octave_idx_type i = 0; i < u; i++) \
2868 F (v, r, ri, n, nanflag, realabs); \
2876 for (octave_idx_type i = 0; i < u; i++) \
2878 F (v, r, ri, l, n, nanflag, realabs); \
2892#define OP_CCUMMINMAX_FCN(F, OP) \
2893 template <typename T> \
2894 void F (const std::complex<T> *v, std::complex<T> *r, \
2895 octave_idx_type n, const bool nanflag, const bool realabs) \
2899 std::complex<T> tmp = v[0]; \
2900 octave_idx_type i = 1; \
2901 octave_idx_type j = 0; \
2902 if (octave::math::isnan (tmp) && ! nanflag) \
2904 for (; j < n; j++) \
2908 else if (octave::math::isnan (tmp)) \
2910 for (; i < n && octave::math::isnan (v[i]); i++) ; \
2911 for (; j < i; j++) \
2918 for (; i < n; i++) \
2920 if (octave::math::isnan (v[i]) && ! nanflag) \
2922 for (; j < i; j++) \
2924 for (; j < n; j++) \
2928 if (v[i].real () OP tmp.real ()) \
2930 for (; j < i; j++) \
2934 else if (v[i].real () == tmp.real () && \
2935 v[i].imag () OP tmp.imag ()) \
2937 for (; j < i; j++) \
2945 for (; i < n; i++) \
2947 if (octave::math::isnan (v[i]) && ! nanflag) \
2949 for (; j < i; j++) \
2951 for (; j < n; j++) \
2955 if (std::abs (v[i]) OP std::abs (tmp)) \
2957 for (; j < i; j++) \
2961 else if (std::abs (v[i]) == std::abs (tmp) && \
2962 std::arg (v[i]) OP std::arg (tmp)) \
2964 for (; j < i; j++) \
2970 for (; j < i; j++) \
2973 template <typename T> \
2974 void F (const std::complex<T> *v, std::complex<T> *r, \
2975 octave_idx_type *ri, octave_idx_type n, const bool nanflag, \
2976 const bool realabs) \
2980 std::complex<T> tmp = v[0]; \
2981 octave_idx_type tmpi = 0; \
2982 octave_idx_type i = 1; \
2983 octave_idx_type j = 0; \
2984 if (octave::math::isnan (tmp) && ! nanflag) \
2986 for (; j < n; j++) \
2993 else if (octave::math::isnan (tmp)) \
2995 for (; i < n && octave::math::isnan (v[i]); i++) ; \
2996 for (; j < i; j++) \
3009 for (; i < n; i++) \
3011 if (octave::math::isnan (v[i]) && ! nanflag) \
3013 for (; j < i; j++) \
3018 for (; j < n; j++) \
3025 if (v[i].real () OP tmp.real ()) \
3027 for (; j < i; j++) \
3035 else if (v[i].real () == tmp.real () && \
3036 v[i].imag () OP tmp.imag ()) \
3038 for (; j < i; j++) \
3050 for (; i < n; i++) \
3052 if (octave::math::isnan (v[i]) && ! nanflag) \
3054 for (; j < i; j++) \
3059 for (; j < n; j++) \
3066 if (std::abs (v[i]) OP std::abs (tmp)) \
3068 for (; j < i; j++) \
3076 else if (std::abs (v[i]) == std::abs (tmp) && \
3077 std::arg (v[i]) OP std::arg (tmp)) \
3079 for (; j < i; j++) \
3089 for (; j < i; j++) \
3099#define OP_CCUMMINMAX_FCN2(F, OP) \
3100 template <typename T> \
3102 F (const std::complex<T> *v, std::complex<T> *r, octave_idx_type m, \
3103 octave_idx_type n, const bool nanflag, const bool realabs) \
3107 const std::complex<T> *r0; \
3108 octave_idx_type j = 0; \
3109 for (octave_idx_type i = 0; i < m; i++) \
3117 while (! nanflag && j < n) \
3119 for (octave_idx_type i = 0; i < m; i++) \
3121 if (octave::math::isnan (v[i]) || \
3122 octave::math::isnan (r0[i])) \
3124 else if (v[i].real () OP r0[i].real ()) \
3126 else if (v[i].real () == r0[i].real () && \
3127 v[i].imag () OP r0[i].imag ()) \
3137 while (nanflag && j < n) \
3139 for (octave_idx_type i = 0; i < m; i++) \
3141 if (octave::math::isnan (r0[i])) \
3143 else if (v[i].real () OP r0[i].real ()) \
3145 else if (v[i].real () == r0[i].real () && \
3146 v[i].imag () OP r0[i].imag ()) \
3159 while (! nanflag && j < n) \
3161 for (octave_idx_type i = 0; i < m; i++) \
3163 if (octave::math::isnan (v[i]) || \
3164 octave::math::isnan (r0[i])) \
3166 else if (std::abs (v[i]) OP std::abs (r0[i])) \
3168 else if (std::abs (v[i]) == std::abs (r0[i]) && \
3169 std::arg (v[i]) OP std::arg (r0[i])) \
3179 while (nanflag && j < n) \
3181 for (octave_idx_type i = 0; i < m; i++) \
3183 if (octave::math::isnan (r0[i])) \
3185 else if (std::abs (v[i]) OP std::abs (r0[i])) \
3187 else if (std::abs (v[i]) == std::abs (r0[i]) && \
3188 std::arg (v[i]) OP std::arg (r0[i])) \
3200 template <typename T> \
3202 F (const std::complex<T> *v, std::complex<T> *r, octave_idx_type *ri, \
3203 octave_idx_type m, octave_idx_type n, const bool nanflag, \
3204 const bool realabs) \
3208 const std::complex<T> *r0; \
3209 const octave_idx_type *r0i; \
3210 octave_idx_type j = 0; \
3211 for (octave_idx_type i = 0; i < m; i++) \
3224 while (! nanflag && j < n) \
3226 for (octave_idx_type i = 0; i < m; i++) \
3228 if (octave::math::isnan (v[i]) && \
3229 octave::math::isnan (r0[i])) \
3234 else if (octave::math::isnan (v[i])) \
3239 else if (v[i].real () OP r0[i].real ()) \
3244 else if (v[i].real () == r0[i].real () && \
3245 v[i].imag () OP r0[i].imag ()) \
3263 while (nanflag && j < n) \
3265 for (octave_idx_type i = 0; i < m; i++) \
3267 if (octave::math::isnan (r0[i]) && \
3268 octave::math::isnan (v[i])) \
3273 else if (octave::math::isnan (r0[i])) \
3278 else if (v[i].real () OP r0[i].real ()) \
3283 else if (v[i].real () == r0[i].real () && \
3284 v[i].imag () OP r0[i].imag ()) \
3305 while (! nanflag && j < n) \
3307 for (octave_idx_type i = 0; i < m; i++) \
3309 if (octave::math::isnan (v[i]) && \
3310 octave::math::isnan (r0[i])) \
3315 else if (octave::math::isnan (v[i])) \
3320 else if (std::abs (v[i]) OP std::abs (r0[i])) \
3325 else if (std::abs (v[i]) == std::abs (r0[i]) && \
3326 std::arg (v[i]) OP std::arg (r0[i])) \
3344 while (nanflag && j < n) \
3346 for (octave_idx_type i = 0; i < m; i++) \
3348 if (octave::math::isnan (r0[i]) && \
3349 octave::math::isnan (v[i])) \
3354 else if (octave::math::isnan (r0[i])) \
3359 else if (std::abs (v[i]) OP std::abs (r0[i])) \
3364 else if (std::abs (v[i]) == std::abs (r0[i]) && \
3365 std::arg (v[i]) OP std::arg (r0[i])) \
3389#define OP_CCUMMINMAX_FCNN(F) \
3390 template <typename T> \
3392 F (const T *v, T *r, octave_idx_type l, octave_idx_type n, \
3393 octave_idx_type u, const bool nanflag, const bool realabs) \
3399 for (octave_idx_type i = 0; i < u; i++) \
3401 F (v, r, n, nanflag, realabs); \
3408 for (octave_idx_type i = 0; i < u; i++) \
3410 F (v, r, l, n, nanflag, realabs); \
3416 template <typename T> \
3418 F (const T *v, T *r, octave_idx_type *ri, octave_idx_type l, \
3419 octave_idx_type n, octave_idx_type u, const bool nanflag, \
3420 const bool realabs) \
3426 for (octave_idx_type i = 0; i < u; i++) \
3428 F (v, r, ri, n, nanflag, realabs); \
3436 for (octave_idx_type i = 0; i < u; i++) \
3438 F (v, r, ri, l, n, nanflag, realabs); \
3452#define OP_INT_CUMMINMAX_FCN(F, OP) \
3453 template <typename T> \
3454 void F (const T *v, T *r, octave_idx_type n, const bool realabs) \
3459 octave_idx_type i = 1; \
3460 octave_idx_type j = 0; \
3463 for (; i < n; i++) \
3466 for (; j < i; j++) \
3473 for (; i < n; i++) \
3475 if (mappers_abs (v[i]) OP mappers_abs (tmp)) \
3477 for (; j < i; j++) \
3481 else if (mappers_abs (v[i]) == mappers_abs (tmp) && \
3484 for (; j < i; j++) \
3490 for (; j < i; j++) \
3493 template <typename T> \
3494 void F (const T *v, T *r, octave_idx_type *ri, octave_idx_type n, \
3495 const bool realabs) \
3500 octave_idx_type tmpi = 0; \
3501 octave_idx_type i = 1; \
3502 octave_idx_type j = 0; \
3505 for (; i < n; i++) \
3508 for (; j < i; j++) \
3519 for (; i < n; i++) \
3521 if (mappers_abs (v[i]) OP mappers_abs (tmp)) \
3523 for (; j < i; j++) \
3531 else if (mappers_abs (v[i]) == mappers_abs (tmp) && \
3534 for (; j < i; j++) \
3544 for (; j < i; j++) \
3554#define OP_INT_CUMMINMAX_FCN2(F, OP) \
3555 template <typename T> \
3557 F (const T *v, T *r, octave_idx_type m, octave_idx_type n, \
3558 const bool realabs) \
3563 octave_idx_type j = 0; \
3564 for (octave_idx_type i = 0; i < m; i++) \
3576 for (octave_idx_type i = 0; i < m; i++) \
3578 if (v[i] OP r0[i]) \
3593 for (octave_idx_type i = 0; i < m; i++) \
3595 if (mappers_abs (v[i]) OP mappers_abs (r0[i])) \
3597 else if (mappers_abs (v[i]) == mappers_abs (r0[i]) && \
3610 template <typename T> \
3612 F (const T *v, T *r, octave_idx_type *ri, octave_idx_type m, \
3613 octave_idx_type n, const bool realabs) \
3618 const octave_idx_type *r0i; \
3619 octave_idx_type j = 0; \
3620 for (octave_idx_type i = 0; i < m; i++) \
3622 r[i] = v[i]; ri[i] = 0; \
3634 for (octave_idx_type i = 0; i < m; i++) \
3636 if (v[i] OP r0[i]) \
3659 for (octave_idx_type i = 0; i < m; i++) \
3661 if (mappers_abs (v[i]) OP mappers_abs (r0[i])) \
3666 else if (mappers_abs (v[i]) == mappers_abs (r0[i]) \
3691#define OP_INT_CUMMINMAX_FCNN(F) \
3692 template <typename T> \
3694 F (const T *v, T *r, octave_idx_type l, octave_idx_type n, \
3695 octave_idx_type u, const bool realabs) \
3701 for (octave_idx_type i = 0; i < u; i++) \
3703 F (v, r, n, realabs); \
3710 for (octave_idx_type i = 0; i < u; i++) \
3712 F (v, r, l, n, realabs); \
3718 template <typename T> \
3720 F (const T *v, T *r, octave_idx_type *ri, octave_idx_type l, \
3721 octave_idx_type n, octave_idx_type u, const bool realabs) \
3727 for (octave_idx_type i = 0; i < u; i++) \
3729 F (v, r, ri, n, realabs); \
3737 for (octave_idx_type i = 0; i < u; i++) \
3739 F (v, r, ri, l, n, realabs); \
3750template <typename T>
3758 r[i] = v[i+1] - v[i];
3763 T lst = v[1] - v[0];
3766 T dif = v[i+2] - v[i+1];
3777 buf[i] = v[i+1] - v[i];
3782 buf[i] = buf[i+1] - buf[i];
3791template <
typename T>
3801 r[i] = v[i+m] - v[i];
3807 r[j] = (v[j+m+m] - v[j+m]) - (v[j+m] - v[j]);
3817 buf[i] = v[i*m+j+m] - v[i*m+j];
3822 buf[i] = buf[i+1] - buf[i];
3832template <
typename T>
3844 v += n; r += n-order;
3878 l = 1, n = dims(dim), u = 1;
3888template <
typename R,
typename T>
3898 if (dims.
ndims () == 2 && dims(0) == 0 && dims(1) == 0 && dim == -1)
3904 if (dim < dims.
ndims ()) dims(dim) = 1;
3908 mx_red_op (src.
data (), ret.
rwdata (), l, n, u);
3915template <
typename R,
typename T>
3925 if (dims.
ndims () == 2 && dims(0) == 0 && dims(1) == 0 && dim == -1)
3931 if (dim < dims.
ndims ()) dims(dim) = 1;
3935 mx_red_op (src.
data (), ret.
rwdata (), l, n, u, nanflag);
3940template <
typename R,
typename T>
3952 mx_flip_op (src.
data (), ret.
rwdata (), l, n, u);
3957template <
typename R,
typename T>
3969 mx_cum_op (src.
data (), ret.
rwdata (), l, n, u);
3974template <
typename R,
typename T>
3986 mx_cum_op (src.
data (), ret.
rwdata (), l, n, u, nanflag);
3993template <
typename R>
4005 if (dim < dims.
ndims () && dims(dim) != 0) dims(dim) = 1;
4009 mx_minmax_op (src.
data (), ret.
rwdata (), l, n, u, nanflag, realabs);
4014template <
typename R>
4017 bool nanflag,
bool realabs,
4027 if (dim < dims.
ndims () && dims(dim) != 0) dims(dim) = 1;
4034 l, n, u, nanflag, realabs);
4041template <
typename R>
4052 if (dim < dims.
ndims () && dims(dim) != 0) dims(dim) = 1;
4056 mx_minmax_op (src.
data (), ret.
rwdata (), l, n, u, realabs);
4061template <
typename R>
4074 if (dim < dims.
ndims () && dims(dim) != 0) dims(dim) = 1;
4080 mx_minmax_op (src.
data (), ret.
rwdata (), idx.
rwdata (), l, n, u, realabs);
4087template <
typename R>
4098 if (dim < dims.
ndims () && dims(dim) != 0) dims(dim) = 1;
4102 mx_minmax_op (src.
data (), ret.
rwdata (), l, n, u);
4107template <
typename R>
4119 if (dim < dims.
ndims () && dims(dim) != 0) dims(dim) = 1;
4132template <
typename R>
4144 mx_cumminmax_op (src.
data (), ret.
rwdata (), l, n, u, nanflag, realabs);
4149template <
typename R>
4152 bool nanflag,
bool realabs,
4165 l, n, u, nanflag, realabs);
4172template <
typename R>
4184 mx_cumminmax_op (src.
data (), ret.
rwdata (), l, n, u, realabs);
4189template <
typename R>
4210template <
typename R>
4213 void (*mx_diff_op) (
const R *, R *,
4224 if (dim >= dims.
ndims ())
4227 if (dims(dim) <= order)
4238 mx_diff_op (src.
data (), ret.
rwdata (), l, n, u, order);
4250template <
typename T>
4258 if (! octave::math::isfinite (s1))
4266 const T e1 = (s - (s1 - t)) + (
x - t);
4274template <
typename T>
4280 bool posinf =
false;
4281 bool neginf =
false;
4282 bool seen_nan =
false;
4288 if (octave::math::isnan (val))
4299 if (! octave::math::isinf (val))
4301 else if (val > zero)
4307 if (octave::math::isinf (s))
4316 return std::numeric_limits<T>::quiet_NaN ();
4318 if (posinf && neginf)
4319 return std::numeric_limits<T>::quiet_NaN ();
4321 return std::numeric_limits<T>::infinity ();
4323 return -std::numeric_limits<T>::infinity ();
4329template <
typename T>
4339 bool posinf =
false;
4340 bool neginf =
false;
4341 bool seen_nan =
false;
4345 const T val = v[i + j*l];
4347 if (octave::math::isnan (val))
4358 if (! octave::math::isinf (val))
4360 else if (val > zero)
4366 if (octave::math::isinf (s))
4374 if (seen_nan || (posinf && neginf))
4375 r[i] = std::numeric_limits<T>::quiet_NaN ();
4377 r[i] = std::numeric_limits<T>::infinity ();
4379 r[i] = -std::numeric_limits<T>::infinity ();
Array< R > do_bsxfun1_op(const Array< X > &x, const Array< Y > &y, const bool nanflag, void(*op_vv)(std::size_t, R *, const X *, const Y *, const bool), void(*op_sv)(std::size_t, R *, X, const Y *, const bool), void(*op_vs)(std::size_t, R *, const X *, Y, const bool))
Array< R > do_bsxfun_op(const Array< X > &x, const Array< Y > &y, void(*op_vv)(std::size_t, R *, const X *, const Y *), void(*op_sv)(std::size_t, R *, X, const Y *), void(*op_vs)(std::size_t, R *, const X *, Y))
void do_inplace_bsxfun_op(Array< R > &r, const Array< X > &x, void(*op_vv)(std::size_t, R *, const X *), void(*op_vs)(std::size_t, R *, X))
Array< R > do_bsxfun2_op(const Array< X > &x, const Array< Y > &y, const bool nanflag, const bool realabs, void(*op_vv)(std::size_t, R *, const X *, const Y *, const bool, const bool), void(*op_sv)(std::size_t, R *, X, const Y *, const bool, const bool), void(*op_vs)(std::size_t, R *, const X *, Y, const bool, const bool))
bool is_valid_inplace_bsxfun(const dim_vector &rdv, const dim_vector &xdv)
bool is_valid_bsxfun(const dim_vector &xdv, const dim_vector &ydv)
N Dimensional Array with copy-on-write semantics.
const dim_vector & dims() const
Return a const-reference so that dims ()(i) works efficiently.
const T * data() const
Size of the specified dimension.
T * rwdata()
Size of the specified dimension.
octave_idx_type numel() const
Number of elements in the array.
Vector representing the dimensions (size) of an Array.
octave_idx_type numel(int n=0) const
Number of elements that a matrix with this dimensions would have.
void chop_trailing_singletons()
void resize(int n, int fill_value=0)
octave_idx_type ndims() const
Number of dimensions.
int first_non_singleton(int def=0) const
double double_value() const
ColumnVector real(const ComplexColumnVector &a)
ColumnVector imag(const ComplexColumnVector &a)
void mx_inline_map(std::size_t n, R *r, const X *x)
void mx_inline_intcummax(const T *v, T *r, octave_idx_type n, const bool realabs)
Array< R > do_mx_unary_op(const Array< X > &x, void(*op)(std::size_t, R *, const X *))
void mx_inline_intmin(const T *v, T *r, octave_idx_type n, const bool realabs)
bool mx_inline_any(const T *v, octave_idx_type n)
void mx_inline_div2(std::size_t n, R *r, const X *x)
bool do_mx_check(const Array< T > &a, bool(*op)(std::size_t, const T *))
void mx_inline_sub2(std::size_t n, R *r, const X *x)
subst_template_param< std::complex, T, double >::type mx_inline_dsumsq(const T *v, octave_idx_type n)
void mx_inline_notzero(std::size_t n, bool *r, const X *x)
#define DEFMXCMPOP(F, OP)
void mx_inline_xmin(std::size_t n, T *r, const T *x, const T *y)
void mx_inline_not_and(std::size_t n, bool *r, const X *x, const Y *y)
#define OP_RED_ANYR(ac, el)
Array< R > & do_mm_inplace_op(Array< R > &r, const Array< X > &x, void(*op)(std::size_t, R *, const X *), void(*op1)(std::size_t, R *, X), const char *opname)
#define OP_CUM_FCN2(F, TSRC, TRES, OP)
void mx_inline_le(std::size_t n, bool *r, const X *x, const Y *y)
#define OP_ROW_SHORT_CIRCUIT(F, PRED, ZERO)
#define OP_RED_SUMSQC(ac, el)
void mx_inline_cummin(const T *v, T *r, octave_idx_type n, const bool nanflag, const bool realabs)
void mx_inline_intcummin(const T *v, T *r, octave_idx_type n, const bool realabs)
#define OP_INT_CUMMINMAX_FCNN(F)
void mx_inline_add2(std::size_t n, R *r, const X *x)
Array< R > do_ms_binary_op(const Array< X > &x, const Y &y, void(*op)(std::size_t, R *, const X *, Y))
void mx_inline_and_not(std::size_t n, bool *r, const X *x, const Y *y)
void mx_inline_ccummax(const std::complex< T > *v, std::complex< T > *r, octave_idx_type n, const bool nanflag, const bool realabs)
#define OP_RED_FCNN(F, TSRC, TRES)
#define OP_CUMMINMAX_FCN(F, OP)
void mx_inline_sub(std::size_t n, R *r, const X *x, const Y *y)
#define OP_RED_NAN_FCN2(F, TSRC, TRES, OP, ZERO)
void mx_inline_uminus(std::size_t n, R *r, const X *x)
Array< R > & do_mx_inplace_op(Array< R > &r, void(*op)(std::size_t, R *))
void mx_inline_cummax(const T *v, T *r, octave_idx_type n, const bool nanflag, const bool realabs)
#define OP_CMINMAX_FCNN(F)
subst_template_param< std::complex, T, double >::type mx_inline_dprod(const T *v, octave_idx_type n)
void mx_inline_uminus2(std::size_t n, R *r)
void mx_inline_eq(std::size_t n, bool *r, const X *x, const Y *y)
#define OP_RED_ALLC(ac, el)
#define OP_CHMINMAX_FCN2(F, OP)
#define OP_INT_CUMMINMAX_FCN(F, OP)
#define DEFMXBOOLOP(F, NOT1, OP, NOT2)
void mx_inline_ge(std::size_t n, bool *r, const X *x, const Y *y)
bool mx_inline_all_real(std::size_t n, const std::complex< T > *x)
#define PROMOTE_DOUBLE(T)
void mx_inline_min(const T *v, T *r, octave_idx_type n, const bool nanflag, const bool realabs)
void mx_inline_or(std::size_t n, bool *r, const X *x, const Y *y)
void mx_inline_chmin(const T *v, T *r, octave_idx_type n)
void mx_inline_div(std::size_t n, R *r, const X *x, const Y *y)
#define OP_MINMAX_FCN2(F, OP)
Array< R > do_mx_minmax_op(const Array< R > &src, int dim, bool nanflag, bool realabs, void(*mx_minmax_op)(const R *, R *, octave_idx_type, octave_idx_type, octave_idx_type, bool, bool))
void mx_inline_cumprod(const T *v, T *r, octave_idx_type n)
Array< R > do_mx_cum_op(const Array< T > &src, int dim, void(*mx_cum_op)(const T *, R *, octave_idx_type, octave_idx_type, octave_idx_type))
#define OP_INT_CUMMINMAX_FCN2(F, OP)
void mx_inline_cumsum(const T *v, T *r, octave_idx_type n)
void twosum_accum(T &s, T &e, const T &x)
bool mx_inline_any_nan(std::size_t n, const T *x)
void mx_inline_and2(std::size_t n, bool *r, const X *x)
Array< R > do_mx_red_op(const Array< T > &src, int dim, void(*mx_red_op)(const T *, R *, octave_idx_type, octave_idx_type, octave_idx_type))
#define DEFMXBINOPEQ(F, OP)
#define OP_CUM_FCN(F, TSRC, TRES, OP)
void mx_inline_iszero(std::size_t n, bool *r, const X *x)
void mx_inline_xmax(std::size_t n, T *r, const T *x, const T *y)
void mx_inline_any_r(const T *v, bool *r, octave_idx_type m, octave_idx_type n)
T mx_inline_count(const bool *v, octave_idx_type n)
void mx_inline_and(std::size_t n, bool *r, const X *x, const Y *y)
#define OP_MINMAX_FCNN(F)
#define OP_CCUMMINMAX_FCNN(F)
void mx_inline_add(std::size_t n, R *r, const X *x, const Y *y)
void mx_inline_intmax(const T *v, T *r, octave_idx_type n, const bool realabs)
#define OP_CUM_NAN_FCN(F, TSRC, TRES, OP, ZERO)
void mx_inline_not(std::size_t n, bool *r, const X *x)
#define OP_CUM_FCNN(F, TSRC, TRES)
Array< R > & do_ms_inplace_op(Array< R > &r, const X &x, void(*op)(std::size_t, R *, X))
void mx_inline_cmax(const std::complex< T > *v, std::complex< T > *r, octave_idx_type n, const bool nanflag, const bool realabs)
void mx_inline_not_or(std::size_t n, bool *r, const X *x, const Y *y)
void mx_inline_flip(const T *v, T *r, octave_idx_type n)
Array< R > do_mm_binary_op(const Array< X > &x, const Array< Y > &y, void(*op)(std::size_t, R *, const X *, const Y *), void(*op1)(std::size_t, R *, X, const Y *), void(*op2)(std::size_t, R *, const X *, Y), const char *opname)
Array< R > do_mx_cumminmax_op(const Array< R > &src, int dim, bool nanflag, bool realabs, void(*mx_cumminmax_op)(const R *, R *, octave_idx_type, octave_idx_type, octave_idx_type, bool, bool))
#define OP_CUMMINMAX_FCN2(F, OP)
Array< R > do_sm_binary_op(const X &x, const Array< Y > &y, void(*op)(std::size_t, R *, X, const Y *))
void op_dble_prod(double &ac, float el)
#define OP_CMINMAX_FCN(F, OP)
T cabsq(const std::complex< T > &c)
#define OP_RED_FCN2(F, TSRC, TRES, OP, ZERO)
#define OP_INT_MINMAX_FCNN(F)
void mx_inline_gt(std::size_t n, bool *r, const X *x, const Y *y)
void op_dble_sum(double &ac, float el)
#define OP_INT_MINMAX_FCN(F, OP)
void mx_inline_all_r(const T *v, bool *r, octave_idx_type m, octave_idx_type n)
#define OP_CCUMMINMAX_FCN(F, OP)
void mx_inline_cumcount(const bool *v, T *r, octave_idx_type n)
void mx_inline_mul2(std::size_t n, R *r, const X *x)
#define OP_RED_ANYC(ac, el)
void mx_inline_lt(std::size_t n, bool *r, const X *x, const Y *y)
void mx_inline_cmin(const std::complex< T > *v, std::complex< T > *r, octave_idx_type n, const bool nanflag, const bool realabs)
#define OP_CUM_NAN_FCN2(F, TSRC, TRES, OP, ZERO)
void mx_inline_max(const T *v, T *r, octave_idx_type n, const bool nanflag, const bool realabs)
bool mx_inline_all(const T *v, octave_idx_type n)
bool mx_inline_equal(std::size_t n, const T1 *x, const T2 *y)
void mx_inline_real(std::size_t n, T *r, const std::complex< T > *x)
#define OP_CHMINMAX_FCN(F, OP)
T mx_inline_sumsq(const T *v, octave_idx_type n)
Array< R > do_mx_unary_map(const Array< X > &x)
#define OP_CUMMINMAX_FCNN(F)
bool mx_inline_any_positive(std::size_t n, const T *x)
void mx_inline_imag(std::size_t n, T *r, const std::complex< T > *x)
T mx_inline_sum(const T *v, octave_idx_type n)
#define OP_CUM_NAN_FCNN(F, TSRC, TRES)
void mx_inline_ccummin(const std::complex< T > *v, std::complex< T > *r, octave_idx_type n, const bool nanflag, const bool realabs)
#define OP_RED_NAN_FCN(F, TSRC, TRES, OP, ZERO)
#define OP_CMINMAX_FCN2(F, OP)
#define OP_CHMINMAX_FCNN(F)
#define OP_RED_SUM(ac, el)
T mx_inline_prod(const T *v, octave_idx_type n)
#define OP_MINMAX_FCN(F, OP)
#define OP_RED_FCN(F, TSRC, TRES, OP, ZERO)
void mx_inline_chmax(const T *v, T *r, octave_idx_type n)
void mx_inline_diff(const T *v, T *r, octave_idx_type n, octave_idx_type order)
void mx_inline_or2(std::size_t n, bool *r, const X *x)
bool mx_inline_all_finite(std::size_t n, const T *x)
void mx_inline_mul(std::size_t n, R *r, const X *x, const Y *y)
#define OP_RED_PROD(ac, el)
bool mx_inline_any_negative(std::size_t n, const T *x)
#define OP_CCUMMINMAX_FCN2(F, OP)
Array< R > do_mx_flip_op(const Array< T > &src, int dim, void(*mx_flip_op)(const T *, R *, octave_idx_type, octave_idx_type, octave_idx_type))
T mx_inline_xsum(const T *v, octave_idx_type n, bool nanflag)
void get_extent_triplet(const dim_vector &dims, int &dim, octave_idx_type &l, octave_idx_type &n, octave_idx_type &u)
#define OP_INT_MINMAX_FCN2(F, OP)
void mx_inline_pow(std::size_t n, R *r, const X *x, const Y *y)
Array< R > do_mx_diff_op(const Array< R > &src, int dim, octave_idx_type order, void(*mx_diff_op)(const R *, R *, octave_idx_type, octave_idx_type, octave_idx_type, octave_idx_type))
void mx_inline_fill(std::size_t n, R *r, S s)
void mx_inline_not2(std::size_t n, bool *r)
void mx_inline_ne(std::size_t n, bool *r, const X *x, const Y *y)
#define OP_RED_ALLR(ac, el)
#define OP_RED_NAN_FCNN(F, TSRC, TRES)
subst_template_param< std::complex, T, double >::type mx_inline_dsum(const T *v, octave_idx_type n)
#define OP_RED_SUMSQ(ac, el)
void mx_inline_or_not(std::size_t n, bool *r, const X *x, const Y *y)
#define DEFMXBINOP(F, OP)
std::complex< double > Complex
std::complex< float > FloatComplex
octave_int< T > pow(const octave_int< T > &a, const octave_int< T > &b)
#define OCTAVE_LOCAL_BUFFER(T, buf, size)
F77_RET_T const F77_DBLE * x