26#if defined (HAVE_CONFIG_H)
45#include "mx-fcm-fcdm.h"
60err_failed_diagonalization ()
62 error (
"Failed to diagonalize matrix while calculating matrix exponential");
66err_nonsquare_matrix ()
68 error (
"for x^y, only square matrix arguments are permitted and one " \
69 "argument must be scalar. Use .^ for elementwise power.");
76 return (octave::math::is_integer (
x)
77 &&
x <= std::numeric_limits<int>::max ()
78 &&
x >= std::numeric_limits<int>::min ());
84 static constexpr float out_of_range_top
85 =
static_cast<float> (std::numeric_limits<int>::max ()) + 1.0;
95 return (octave::math::is_integer (
x)
96 &&
x < out_of_range_top
97 &&
x >= std::numeric_limits<int>::min ());
119 if (a < 0.0 && ! xisint (b))
123 return std::pow (acplx, b);
126 retval = std::pow (a, b);
140 if (nr == 0 || nc == 0)
144 err_nonsquare_matrix ();
154 lambda(i) = std::pow (a, lambda(i));
164 catch (
const octave::execution_exception&)
166 err_failed_diagonalization ();
176 Complex result = std::pow (a, b);
189 if (nr == 0 || nc == 0)
193 err_nonsquare_matrix ();
203 lambda(i) = std::pow (a, lambda(i));
209 catch (
const octave::execution_exception&)
211 err_failed_diagonalization ();
226 if (nr == 0 || nc == 0)
230 err_nonsquare_matrix ();
234 int bint =
static_cast<int> (b);
253 atmp = a.
inverse (mattype, info, rcond, 1);
256 warning (
"inverse: matrix singular to machine precision, rcond = %g", rcond);
270 result = atmp * result;
291 lambda(i) = std::pow (lambda(i), b);
297 catch (
const octave::execution_exception&)
299 err_failed_diagonalization ();
315 if (nr == 0 || nc == 0)
319 err_nonsquare_matrix ();
323 int bint =
static_cast<int> (b);
345 return a.
power (
static_cast<int> (b));
359 if (nr == 0 || nc == 0)
363 err_nonsquare_matrix ();
373 lambda(i) = std::pow (lambda(i), b);
379 catch (
const octave::execution_exception&)
381 err_failed_diagonalization ();
394 result = std::pow (a,
static_cast<int> (b));
396 result = std::pow (a, b);
410 if (nr == 0 || nc == 0)
414 err_nonsquare_matrix ();
424 lambda(i) = std::pow (a, lambda(i));
430 catch (
const octave::execution_exception&)
432 err_failed_diagonalization ();
443 result = std::pow (a, b);
456 if (nr == 0 || nc == 0)
460 err_nonsquare_matrix ();
470 lambda(i) = std::pow (a, lambda(i));
476 catch (
const octave::execution_exception&)
478 err_failed_diagonalization ();
493 if (nr == 0 || nc == 0)
497 err_nonsquare_matrix ();
501 int bint =
static_cast<int> (b);
520 atmp = a.
inverse (mattype, info, rcond, 1);
523 warning (
"inverse: matrix singular to machine precision, rcond = %g", rcond);
537 result = atmp * result;
558 lambda(i) = std::pow (lambda(i), b);
564 catch (
const octave::execution_exception&)
566 err_failed_diagonalization ();
582 if (nr == 0 || nc == 0)
586 err_nonsquare_matrix ();
596 lambda(i) = std::pow (lambda(i), b);
602 catch (
const octave::execution_exception&)
604 err_failed_diagonalization ();
619 if (nr == 0 || nc == 0)
623 err_nonsquare_matrix ();
694 result(i, j) = std::pow (acplx, b(i, j));
707 result(i, j) = std::pow (a, b(i, j));
730 result(i, j) = std::pow (acplx, b(i, j));
737same_sign (
double a,
double b)
739 return (a >= 0 && b >= 0) || (a <= 0 && b <= 0);
749 if (r.numel () > 1 && r.all_elements_are_ints ()
750 && same_sign (r.base (), r.limit ()))
754 if (same_sign (r.base (), r.increment ()))
756 double base = std::pow (a, r.base ());
757 double inc = std::pow (a, r.increment ());
760 result(i) = (base *= inc);
764 double limit = std::pow (a, r.final_value ());
765 double inc = std::pow (a, -r.increment ());
768 result(i) = (limit *= inc);
775 Matrix tmp = r.array_value ();
802 result(i, j) = std::pow (acplx, b);
815 result(i, j) = std::pow (a(i, j), b);
836 if (nr != b_nr || nc != b_nc)
837 octave::err_nonconformant (
"operator .^", nr, nc, b_nr, b_nc);
839 bool convert_to_complex =
false;
844 double atmp = a(i, j);
845 double btmp = b(i, j);
846 if (atmp < 0.0 && ! xisint (btmp))
848 convert_to_complex =
true;
855 if (convert_to_complex)
865 complex_result(i, j) = std::pow (acplx, bcplx);
868 retval = complex_result;
878 result(i, j) = std::pow (a(i, j), b(i, j));
900 result(i, j) = std::pow (
Complex (a(i, j)), b);
916 if (nr != b_nr || nc != b_nc)
917 octave::err_nonconformant (
"operator .^", nr, nc, b_nr, b_nc);
925 result(i, j) = std::pow (
Complex (a(i, j)), b(i, j));
944 double btmp = b(i, j);
946 result(i, j) = std::pow (a,
static_cast<int> (btmp));
948 result(i, j) = std::pow (a, btmp);
967 result(i, j) = std::pow (a, b(i, j));
980 if (r.numel () > 1 && r.all_elements_are_ints ()
981 && same_sign (r.base (), r.limit ()))
986 if (same_sign (r.base (), r.increment ()))
988 Complex base = std::pow (a, r.base ());
989 Complex inc = std::pow (a, r.increment ());
992 result(i) = (base *= inc);
996 Complex limit = std::pow (a, r.final_value ());
997 Complex inc = std::pow (a, -r.increment ());
1000 result(i) = (limit *= inc);
1007 Matrix tmp = r.array_value ();
1025 int bint =
static_cast<int> (b);
1030 result(i, j) = std::pow (a(i, j), bint);
1039 result(i, j) = std::pow (a(i, j), b);
1056 if (nr != b_nr || nc != b_nc)
1057 octave::err_nonconformant (
"operator .^", nr, nc, b_nr, b_nc);
1065 double btmp = b(i, j);
1067 result(i, j) = std::pow (a(i, j),
static_cast<int> (btmp));
1069 result(i, j) = std::pow (a(i, j), btmp);
1088 result(i, j) = std::pow (a(i, j), b);
1104 if (nr != b_nr || nc != b_nc)
1105 octave::err_nonconformant (
"operator .^", nr, nc, b_nr, b_nc);
1113 result(i, j) = std::pow (a(i, j), b(i, j));
1160 result(i) = std::pow (acplx, b(i));
1171 result(i) = std::pow (a, b(i));
1189 result(i) = std::pow (a, b(i));
1205 int bint =
static_cast<int> (b);
1209 result.
xelem (i) = a(i) * a(i);
1214 result.
xelem (i) = a(i) * a(i) * a(i);
1216 else if (bint == -1)
1219 result.
xelem (i) = 1.0 / a(i);
1226 result.
xelem (i) = std::pow (a(i), bint);
1242 result(i) = std::pow (acplx, b);
1253 result(i) = std::pow (a(i), b);
1272 if (a_dims != b_dims)
1275 octave::err_nonconformant (
"operator .^", a_dims, b_dims);
1288 bool convert_to_complex =
false;
1295 if (atmp < 0.0 && ! xisint (btmp))
1297 convert_to_complex =
true;
1304 if (convert_to_complex)
1312 complex_result(i) = std::pow (acplx, b(i));
1315 retval = complex_result;
1324 result(i) = std::pow (a(i), b(i));
1342 result(i) = std::pow (a(i), b);
1355 if (a_dims != b_dims)
1358 octave::err_nonconformant (
"operator .^", a_dims, b_dims);
1368 result(i) = std::pow (a(i), b(i));
1385 result(i) = std::pow (a,
static_cast<int> (btmp));
1387 result(i) = std::pow (a, btmp);
1402 result(i) = std::pow (a, b(i));
1416 int bint =
static_cast<int> (b);
1420 result.
xelem (i) = 1.0 / a(i);
1427 result(i) = std::pow (a(i), bint);
1436 result(i) = std::pow (a(i), b);
1450 if (a_dims != b_dims)
1453 octave::err_nonconformant (
"operator .^", a_dims, b_dims);
1465 result(i) = std::pow (a(i),
static_cast<int> (btmp));
1467 result(i) = std::pow (a(i), btmp);
1482 result(i) = std::pow (a(i), b);
1495 if (a_dims != b_dims)
1498 octave::err_nonconformant (
"operator .^", a_dims, b_dims);
1508 result(i) = std::pow (a(i), b(i));
1533 if (a < 0.0 && ! xisint (b))
1537 return std::pow (acplx, b);
1540 retval = std::pow (a, b);
1554 if (nr == 0 || nc == 0)
1558 err_nonsquare_matrix ();
1568 lambda(i) = std::pow (a, lambda(i));
1579 catch (
const octave::execution_exception&)
1581 err_failed_diagonalization ();
1604 if (nr == 0 || nc == 0)
1608 err_nonsquare_matrix ();
1618 lambda(i) = std::pow (a, lambda(i));
1624 catch (
const octave::execution_exception&)
1626 err_failed_diagonalization ();
1641 if (nr == 0 || nc == 0)
1645 err_nonsquare_matrix ();
1649 int bint =
static_cast<int> (b);
1668 atmp = a.
inverse (mattype, info, rcond, 1);
1671 warning (
"inverse: matrix singular to machine precision, rcond = %g", rcond);
1685 result = atmp * result;
1706 lambda(i) = std::pow (lambda(i), b);
1712 catch (
const octave::execution_exception&)
1714 err_failed_diagonalization ();
1730 if (nr == 0 || nc == 0)
1734 err_nonsquare_matrix ();
1738 int bint =
static_cast<int> (b);
1764 if (nr == 0 || nc == 0)
1768 err_nonsquare_matrix ();
1778 lambda(i) = std::pow (lambda(i), b);
1784 catch (
const octave::execution_exception&)
1786 err_failed_diagonalization ();
1799 result = std::pow (a,
static_cast<int> (b));
1801 result = std::pow (a, b);
1815 if (nr == 0 || nc == 0)
1819 err_nonsquare_matrix ();
1829 lambda(i) = std::pow (a, lambda(i));
1835 catch (
const octave::execution_exception&)
1837 err_failed_diagonalization ();
1848 result = std::pow (a, b);
1861 if (nr == 0 || nc == 0)
1865 err_nonsquare_matrix ();
1875 lambda(i) = std::pow (a, lambda(i));
1881 catch (
const octave::execution_exception&)
1883 err_failed_diagonalization ();
1898 if (nr == 0 || nc == 0)
1902 err_nonsquare_matrix ();
1906 int bint =
static_cast<int> (b);
1925 atmp = a.
inverse (mattype, info, rcond, 1);
1928 warning (
"inverse: matrix singular to machine precision, rcond = %g", rcond);
1942 result = atmp * result;
1963 lambda(i) = std::pow (lambda(i), b);
1969 catch (
const octave::execution_exception&)
1971 err_failed_diagonalization ();
1987 if (nr == 0 || nc == 0)
1991 err_nonsquare_matrix ();
2001 lambda(i) = std::pow (lambda(i), b);
2007 catch (
const octave::execution_exception&)
2009 err_failed_diagonalization ();
2024 if (nr == 0 || nc == 0)
2028 err_nonsquare_matrix ();
2099 result(i, j) = std::pow (acplx, b(i, j));
2112 result(i, j) = std::pow (a, b(i, j));
2135 result(i, j) = std::pow (acplx, b(i, j));
2161 result(i, j) = std::pow (acplx, b);
2174 result(i, j) = std::pow (a(i, j), b);
2195 if (nr != b_nr || nc != b_nc)
2196 octave::err_nonconformant (
"operator .^", nr, nc, b_nr, b_nc);
2198 bool convert_to_complex =
false;
2203 float atmp = a(i, j);
2204 float btmp = b(i, j);
2205 if (atmp < 0.0 && ! xisint (btmp))
2207 convert_to_complex =
true;
2214 if (convert_to_complex)
2224 complex_result(i, j) = std::pow (acplx, bcplx);
2227 retval = complex_result;
2237 result(i, j) = std::pow (a(i, j), b(i, j));
2275 if (nr != b_nr || nc != b_nc)
2276 octave::err_nonconformant (
"operator .^", nr, nc, b_nr, b_nc);
2284 result(i, j) = std::pow (
FloatComplex (a(i, j)), b(i, j));
2303 float btmp = b(i, j);
2305 result(i, j) = std::pow (a,
static_cast<int> (btmp));
2307 result(i, j) = std::pow (a, btmp);
2326 result(i, j) = std::pow (a, b(i, j));
2343 int bint =
static_cast<int> (b);
2348 result(i, j) = std::pow (a(i, j), bint);
2357 result(i, j) = std::pow (a(i, j), b);
2374 if (nr != b_nr || nc != b_nc)
2375 octave::err_nonconformant (
"operator .^", nr, nc, b_nr, b_nc);
2383 float btmp = b(i, j);
2385 result(i, j) = std::pow (a(i, j),
static_cast<int> (btmp));
2387 result(i, j) = std::pow (a(i, j), btmp);
2406 result(i, j) = std::pow (a(i, j), b);
2422 if (nr != b_nr || nc != b_nc)
2423 octave::err_nonconformant (
"operator .^", nr, nc, b_nr, b_nc);
2431 result(i, j) = std::pow (a(i, j), b(i, j));
2478 result(i) = std::pow (acplx, b(i));
2489 result(i) = std::pow (a, b(i));
2507 result(i) = std::pow (a, b(i));
2523 int bint =
static_cast<int> (b);
2527 result.
xelem (i) = a(i) * a(i);
2532 result.
xelem (i) = a(i) * a(i) * a(i);
2534 else if (bint == -1)
2537 result.
xelem (i) = 1.0f / a(i);
2544 result.
xelem (i) = std::pow (a(i), bint);
2562 result(i) = std::pow (acplx, b);
2573 result(i) = std::pow (a(i), b);
2592 if (a_dims != b_dims)
2595 octave::err_nonconformant (
"operator .^", a_dims, b_dims);
2608 bool convert_to_complex =
false;
2615 if (atmp < 0.0 && ! xisint (btmp))
2617 convert_to_complex =
true;
2624 if (convert_to_complex)
2632 complex_result(i) = std::pow (acplx, b(i));
2635 retval = complex_result;
2644 result(i) = std::pow (a(i), b(i));
2662 result(i) = std::pow (a(i), b);
2675 if (a_dims != b_dims)
2678 octave::err_nonconformant (
"operator .^", a_dims, b_dims);
2688 result(i) = std::pow (a(i), b(i));
2705 result(i) = std::pow (a,
static_cast<int> (btmp));
2707 result(i) = std::pow (a, btmp);
2722 result(i) = std::pow (a, b(i));
2736 int bint =
static_cast<int> (b);
2740 result.
xelem (i) = 1.0f / a(i);
2747 result(i) = std::pow (a(i), bint);
2756 result(i) = std::pow (a(i), b);
2770 if (a_dims != b_dims)
2773 octave::err_nonconformant (
"operator .^", a_dims, b_dims);
2785 result(i) = std::pow (a(i),
static_cast<int> (btmp));
2787 result(i) = std::pow (a(i), btmp);
2802 result(i) = std::pow (a(i), b);
2815 if (a_dims != b_dims)
2818 octave::err_nonconformant (
"operator .^", a_dims, b_dims);
2828 result(i) = std::pow (a(i), b(i));
2834OCTAVE_END_NAMESPACE(octave)
ComplexNDArray bsxfun_pow(const ComplexNDArray &x, const ComplexNDArray &y)
bool is_valid_bsxfun(const dim_vector &xdv, const dim_vector &ydv)
const dim_vector & dims() const
Return a const-reference so that dims ()(i) works efficiently.
T & xelem(octave_idx_type n)
Size of the specified dimension.
octave_idx_type rows() const
octave_idx_type cols() const
octave_idx_type numel() const
Number of elements in the array.
ComplexDiagMatrix inverse(octave_idx_type &info) const
ComplexMatrix inverse() const
octave_idx_type rows() const
octave_idx_type cols() const
T & dgxelem(octave_idx_type i)
ComplexColumnVector eigenvalues() const
ComplexMatrix right_eigenvectors() const
FloatComplexDiagMatrix inverse(octave_idx_type &info) const
FloatComplexMatrix inverse() const
FloatComplexMatrix right_eigenvectors() const
FloatComplexColumnVector eigenvalues() const
FloatMatrix inverse() const
bool any_element_is_negative(bool=false) const
bool all_integers(float &max_val, float &min_val) const
bool all_integers(double &max_val, double &min_val) const
bool any_element_is_negative(bool=false) const
PermMatrix power(octave_idx_type n) const
Vector representing the dimensions (size) of an Array.
ColumnVector real(const ComplexColumnVector &a)
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
void warning(const char *fmt,...)
void error(const char *fmt,...)
F77_RET_T const F77_INT const F77_INT const F77_INT F77_DBLE const F77_INT F77_DBLE const F77_INT F77_DBLE * Q
std::complex< double > Complex
std::complex< float > FloatComplex
NDArray octave_value_extract< NDArray >(const octave_value &v)
FloatNDArray octave_value_extract< FloatNDArray >(const octave_value &v)
F77_RET_T const F77_DBLE * x
octave_value elem_xpow(double a, const Matrix &b)
octave_value xpow(double a, double b)