26#if defined (HAVE_CONFIG_H)
53#include "mx-fcm-fdm.h"
55#include "mx-fdm-fcm.h"
65static const FloatComplex FloatComplex_NaN_result (octave::numeric_limits<float>::NaN (),
66 octave::numeric_limits<float>::NaN ());
144 elem (i, j) =
static_cast<unsigned char> (a.
elem (i, j));
152 (*current_liboctave_error_handler) (
"complex: internal error");
171 return !(*
this == a);
184 if (elem (i, j) !=
conj (elem (j, i)))
202 if (r < 0 || r + a_nr >
rows () || c < 0 || c + a_nc >
cols ())
203 (*current_liboctave_error_handler) (
"range error for insert");
205 if (a_nr >0 && a_nc > 0)
223 if (r < 0 || r >=
rows () || c < 0 || c + a_len >
cols ())
224 (*current_liboctave_error_handler) (
"range error for insert");
243 if (r < 0 || r + a_len >
rows () || c < 0 || c >=
cols ())
244 (*current_liboctave_error_handler) (
"range error for insert");
264 if (r < 0 || r + a_nr >
rows () || c < 0 || c + a_nc >
cols ())
265 (*current_liboctave_error_handler) (
"range error for insert");
267 fill (0.0, r, c, r + a_nr - 1, c + a_nc - 1);
295 if (r < 0 || r >=
rows () || c < 0 || c + a_len >
cols ())
296 (*current_liboctave_error_handler) (
"range error for insert");
310 if (r < 0 || r + a_len >
rows () || c < 0 || c >=
cols ())
311 (*current_liboctave_error_handler) (
"range error for insert");
331 if (r < 0 || r + a_nr >
rows () || c < 0 || c + a_nc >
cols ())
332 (*current_liboctave_error_handler) (
"range error for insert");
334 fill (0.0, r, c, r + a_nr - 1, c + a_nc - 1);
355 if (nr > 0 && nc > 0)
373 if (nr > 0 && nc > 0)
392 if (r1 < 0 || r2 < 0 || c1 < 0 || c2 < 0
393 || r1 >= nr || r2 >= nr || c1 >= nc || c2 >= nc)
394 (*current_liboctave_error_handler) (
"range error for fill");
396 if (r1 > r2) { std::swap (r1, r2); }
397 if (c1 > c2) { std::swap (c1, c2); }
399 if (r2 >= r1 && c2 >= c1)
419 if (r1 < 0 || r2 < 0 || c1 < 0 || c2 < 0
420 || r1 >= nr || r2 >= nr || c1 >= nc || c2 >= nc)
421 (*current_liboctave_error_handler) (
"range error for fill");
423 if (r1 > r2) { std::swap (r1, r2); }
424 if (c1 > c2) { std::swap (c1, c2); }
426 if (r2 >= r1 && c2 >=c1)
444 (*current_liboctave_error_handler) (
"row dimension mismatch for append");
448 retval.
insert (*
this, 0, 0);
449 retval.
insert (a, 0, nc_insert);
459 (*current_liboctave_error_handler) (
"row dimension mismatch for append");
463 retval.
insert (*
this, 0, 0);
464 retval.
insert (a, 0, nc_insert);
473 if (nr != a.
numel ())
474 (*current_liboctave_error_handler) (
"row dimension mismatch for append");
478 retval.
insert (*
this, 0, 0);
479 retval.
insert (a, 0, nc_insert);
489 (*current_liboctave_error_handler) (
"row dimension mismatch for append");
493 retval.
insert (*
this, 0, 0);
494 retval.
insert (a, 0, nc_insert);
504 (*current_liboctave_error_handler) (
"row dimension mismatch for append");
508 retval.
insert (*
this, 0, 0);
509 retval.
insert (a, 0, nc_insert);
519 (*current_liboctave_error_handler) (
"row dimension mismatch for append");
523 retval.
insert (*
this, 0, 0);
524 retval.
insert (a, 0, nc_insert);
533 if (nr != a.
numel ())
534 (*current_liboctave_error_handler) (
"row dimension mismatch for append");
538 retval.
insert (*
this, 0, 0);
539 retval.
insert (a, 0, nc_insert);
549 (*current_liboctave_error_handler) (
"row dimension mismatch for append");
553 retval.
insert (*
this, 0, 0);
554 retval.
insert (a, 0, nc_insert);
564 (*current_liboctave_error_handler) (
"column dimension mismatch for stack");
568 retval.
insert (*
this, 0, 0);
569 retval.
insert (a, nr_insert, 0);
578 if (nc != a.
numel ())
579 (*current_liboctave_error_handler) (
"column dimension mismatch for stack");
583 retval.
insert (*
this, 0, 0);
584 retval.
insert (a, nr_insert, 0);
594 (*current_liboctave_error_handler) (
"column dimension mismatch for stack");
598 retval.
insert (*
this, 0, 0);
599 retval.
insert (a, nr_insert, 0);
609 (*current_liboctave_error_handler) (
"column dimension mismatch for stack");
613 retval.
insert (*
this, 0, 0);
614 retval.
insert (a, nr_insert, 0);
624 (*current_liboctave_error_handler) (
"column dimension mismatch for stack");
628 retval.
insert (*
this, 0, 0);
629 retval.
insert (a, nr_insert, 0);
638 if (nc != a.
numel ())
639 (*current_liboctave_error_handler) (
"column dimension mismatch for stack");
643 retval.
insert (*
this, 0, 0);
644 retval.
insert (a, nr_insert, 0);
654 (*current_liboctave_error_handler) (
"column dimension mismatch for stack");
658 retval.
insert (*
this, 0, 0);
659 retval.
insert (a, nr_insert, 0);
669 (*current_liboctave_error_handler) (
"column dimension mismatch for stack");
673 retval.
insert (*
this, 0, 0);
674 retval.
insert (a, nr_insert, 0);
681 return do_mx_unary_map<FloatComplex, FloatComplex, std::conj<float>> (a);
690 if (r1 > r2) { std::swap (r1, r2); }
691 if (c1 > c2) { std::swap (c1, c2); }
693 return index (octave::idx_vector (r1, r2+1), octave::idx_vector (c1, c2+1));
700 return index (octave::idx_vector (r1, r1 + nr), octave::idx_vector (c1, c1 + nc));
708 return index (octave::idx_vector (i), octave::idx_vector::colon);
714 return index (octave::idx_vector::colon, octave::idx_vector (i));
727 float sum = colsum.
xelem (i);
728 if (octave::math::isinf (sum) || octave::math::isnan (sum))
734 anorm = std::max (anorm, sum);
743is_singular (
const float rcond)
745 return (std::abs (rcond) <= std::numeric_limits<float>::epsilon ());
754 return inverse (mattype, info, rcon,
false,
false);
762 return inverse (mattype, info, rcon,
false,
false);
767 bool calc_cond)
const
770 return inverse (mattype, info, rcon, force, calc_cond);
778 return inverse (mattype, info, rcon,
false,
false);
785 return inverse (mattype, info, rcon,
false,
false);
790 float& rcon,
bool force,
bool calc_cond)
const
797 if (nr != nc || nr == 0 || nc == 0)
798 (*current_liboctave_error_handler) (
"inverse requires square matrix");
800 int typ = mattype.
type ();
808 F77_XFCN (ctrtri, CTRTRI, (F77_CONST_CHAR_ARG2 (&uplo, 1),
809 F77_CONST_CHAR_ARG2 (&udiag, 1),
812 F77_CHAR_ARG_LEN (1)));
828 F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&job, 1),
829 F77_CONST_CHAR_ARG2 (&uplo, 1),
830 F77_CONST_CHAR_ARG2 (&udiag, 1),
835 F77_CHAR_ARG_LEN (1)));
837 if (ztrcon_info != 0)
841 if (info == -1 && ! force)
849 float& rcon,
bool force,
bool calc_cond)
const
857 (*current_liboctave_error_handler) (
"inverse requires square matrix");
860 F77_INT *pipvt = ipvt.rwdata ();
876 lwork =
static_cast<F77_INT> (std::real (z(0)));
877 lwork = (lwork < 2 * nc ? 2 * nc : lwork);
885 float anorm = norm1 (retval);
889 if (octave::math::isnan (anorm) || octave::math::isinf (anorm))
905 if (octave::math::isnan (anorm))
906 rcon = octave::numeric_limits<float>::NaN ();
914 float *prz = rz.rwdata ();
915 F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
918 F77_CHAR_ARG_LEN (1)));
920 if (cgecon_info != 0)
925 if ((info == -1 && ! force)
926 || octave::math::isnan (anorm) || octave::math::isinf (anorm))
935 if (zgetri_info != 0)
947 float& rcon,
bool force,
bool calc_cond)
const
949 int typ = mattype.
type (
false);
953 typ = mattype.
type (*
this);
958 float real = std::real (scalar);
959 float imag = std::imag (scalar);
963 FloatComplex (octave::numeric_limits<float>::Inf (), 0.0));
969 if (octave::math::isfinite (
real) && octave::math::isfinite (
imag)
972 else if (octave::math::isinf (
real) || octave::math::isinf (
imag)
976 rcon = octave::numeric_limits<float>::NaN ();
980 ret = tinverse (mattype, info, rcon, force, calc_cond);
985 octave::math::chol<FloatComplexMatrix>
chol (*
this, info,
true, calc_cond);
999 ret = finverse (mattype, info, rcon, force, calc_cond);
1001 if ((calc_cond || mattype.
ishermitian ()) && rcon == 0.0)
1004 FloatComplex (octave::numeric_limits<float>::Inf (), 0.0));
1016 octave::math::svd<FloatComplexMatrix> result
1017 (*
this, octave::math::svd<FloatComplexMatrix>::Type::economy);
1031 tol = std::max (nr, nc) * sigma.
elem (0)
1032 * std::numeric_limits<float>::epsilon ();
1035 tol = std::numeric_limits<float>::min ();
1038 while (r >= 0 && sigma.
elem (r) < tol)
1054#if defined (HAVE_FFTW)
1059 std::size_t nr =
rows ();
1060 std::size_t nc =
cols ();
1064 std::size_t npts, nsamples;
1066 if (nr == 1 || nc == 1)
1068 npts = (nr > nc ? nr : nc);
1080 octave::fftw::fft (in, out, npts, nsamples);
1088 std::size_t nr =
rows ();
1089 std::size_t nc =
cols ();
1093 std::size_t npts, nsamples;
1095 if (nr == 1 || nc == 1)
1097 npts = (nr > nc ? nr : nc);
1109 octave::fftw::ifft (in, out, npts, nsamples);
1123 octave::fftw::fftNd (in, out, 2, dv);
1137 octave::fftw::ifftNd (in, out, 2, dv);
1147 (*current_liboctave_error_handler)
1148 (
"support for FFTW was unavailable or disabled when liboctave was built");
1156 (*current_liboctave_error_handler)
1157 (
"support for FFTW was unavailable or disabled when liboctave was built");
1165 (*current_liboctave_error_handler)
1166 (
"support for FFTW was unavailable or disabled when liboctave was built");
1174 (*current_liboctave_error_handler)
1175 (
"support for FFTW was unavailable or disabled when liboctave was built");
1199 bool calc_cond)
const
1202 return determinant (mattype, info, rcon, calc_cond);
1208 bool calc_cond)
const
1219 (*current_liboctave_error_handler) (
"matrix must be square");
1221 int typ = mattype.
type ();
1228 typ = mattype.
type (*
this);
1234 for (
F77_INT i = 0; i < nc; i++)
1235 retval *=
elem (i, i);
1244 anorm = norm1 (*
this);
1249 F77_XFCN (cpotrf, CPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr,
1251 F77_CHAR_ARG_LEN (1)));
1268 float *prz = rz.
rwdata ();
1270 F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
1273 F77_CHAR_ARG_LEN (1)));
1281 for (
F77_INT i = 0; i < nc; i++)
1282 retval *= atmp(i, i);
1284 retval = retval.
square ();
1288 (*current_liboctave_error_handler) (
"det: invalid dense matrix type");
1301 float anorm = norm1 (*
this);
1306 if (octave::math::isnan (anorm))
1332 float *prz = rz.
rwdata ();
1334 F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
1337 F77_CHAR_ARG_LEN (1)));
1349 for (
F77_INT i = 0; i < nc; i++)
1352 retval *= (ipvt(i) != (i+1)) ? -c : c;
1365 return rcond (mattype);
1371 float rcon = octave::numeric_limits<float>::NaN ();
1376 (*current_liboctave_error_handler) (
"matrix must be square");
1378 if (nr == 0 || nc == 0)
1379 rcon = octave::numeric_limits<float>::Inf ();
1382 int typ = mattype.
type ();
1385 typ = mattype.
type (*
this);
1399 float *prz = rz.
rwdata ();
1401 F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&
norm, 1),
1402 F77_CONST_CHAR_ARG2 (&uplo, 1),
1403 F77_CONST_CHAR_ARG2 (&dia, 1),
1406 F77_CHAR_ARG_LEN (1)
1407 F77_CHAR_ARG_LEN (1)
1408 F77_CHAR_ARG_LEN (1)));
1414 (*current_liboctave_error_handler)
1415 (
"permuted triangular matrix not implemented");
1427 float *prz = rz.
rwdata ();
1429 F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&
norm, 1),
1430 F77_CONST_CHAR_ARG2 (&uplo, 1),
1431 F77_CONST_CHAR_ARG2 (&dia, 1),
1434 F77_CHAR_ARG_LEN (1)
1435 F77_CHAR_ARG_LEN (1)
1436 F77_CHAR_ARG_LEN (1)));
1442 (*current_liboctave_error_handler)
1443 (
"permuted triangular matrix not implemented");
1456 anorm = norm1 (atmp);
1458 F77_XFCN (cpotrf, CPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr,
1460 F77_CHAR_ARG_LEN (1)));
1474 float *prz = rz.
rwdata ();
1476 F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
1479 F77_CHAR_ARG_LEN (1)));
1497 anorm = norm1 (atmp);
1502 float *prz = rz.
rwdata ();
1505 if (octave::math::isnan (anorm))
1519 F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
1522 F77_CHAR_ARG_LEN (1)));
1539 solve_singularity_handler sing_handler,
1551 (*current_liboctave_error_handler)
1552 (
"matrix dimension mismatch solution of linear equations");
1554 if (nr == 0 || nc == 0 || b_nc == 0)
1558 int typ = mattype.
type ();
1566 (*current_liboctave_error_handler)
1567 (
"permuted triangular matrix not implemented");
1581 F77_XFCN (ctrtrs, CTRTRS, (F77_CONST_CHAR_ARG2 (&uplo, 1),
1582 F77_CONST_CHAR_ARG2 (&trans, 1),
1583 F77_CONST_CHAR_ARG2 (&dia, 1),
1586 F77_CHAR_ARG_LEN (1)
1587 F77_CHAR_ARG_LEN (1)
1588 F77_CHAR_ARG_LEN (1)));
1601 float *prz = rz.rwdata ();
1603 F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&
norm, 1),
1604 F77_CONST_CHAR_ARG2 (&uplo, 1),
1605 F77_CONST_CHAR_ARG2 (&dia, 1),
1608 F77_CHAR_ARG_LEN (1)
1609 F77_CHAR_ARG_LEN (1)
1610 F77_CHAR_ARG_LEN (1)));
1617 if (is_singular (rcon) || octave::math::isnan (rcon))
1622 sing_handler (rcon);
1624 octave::warn_singular_matrix (rcon);
1639 solve_singularity_handler sing_handler,
1651 (*current_liboctave_error_handler)
1652 (
"matrix dimension mismatch solution of linear equations");
1654 if (nr == 0 || nc == 0 || b_nc == 0)
1658 int typ = mattype.
type ();
1666 (*current_liboctave_error_handler)
1667 (
"permuted triangular matrix not implemented");
1681 F77_XFCN (ctrtrs, CTRTRS, (F77_CONST_CHAR_ARG2 (&uplo, 1),
1682 F77_CONST_CHAR_ARG2 (&trans, 1),
1683 F77_CONST_CHAR_ARG2 (&dia, 1),
1686 F77_CHAR_ARG_LEN (1)
1687 F77_CHAR_ARG_LEN (1)
1688 F77_CHAR_ARG_LEN (1)));
1701 float *prz = rz.rwdata ();
1703 F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&
norm, 1),
1704 F77_CONST_CHAR_ARG2 (&uplo, 1),
1705 F77_CONST_CHAR_ARG2 (&dia, 1),
1708 F77_CHAR_ARG_LEN (1)
1709 F77_CHAR_ARG_LEN (1)
1710 F77_CHAR_ARG_LEN (1)));
1717 if (is_singular (rcon) || octave::math::isnan (rcon))
1722 sing_handler (rcon);
1724 octave::warn_singular_matrix (rcon);
1739 solve_singularity_handler sing_handler,
1740 bool calc_cond)
const
1750 if (nr != nc || nr != b_nr)
1751 (*current_liboctave_error_handler)
1752 (
"matrix dimension mismatch solution of linear equations");
1754 if (nr == 0 || b_nc == 0)
1758 int typ = mattype.
type ();
1773 anorm = norm1 (atmp);
1777 F77_XFCN (cpotrf, CPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr,
1779 F77_CHAR_ARG_LEN (1)));
1799 float *prz = rz.rwdata ();
1801 F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
1804 F77_CHAR_ARG_LEN (1)));
1811 if (is_singular (rcon) || octave::math::isnan (rcon))
1816 sing_handler (rcon);
1818 octave::warn_singular_matrix (rcon);
1827 F77_XFCN (cpotrs, CPOTRS, (F77_CONST_CHAR_ARG2 (&job, 1),
1830 F77_CHAR_ARG_LEN (1)));
1847 F77_INT *pipvt = ipvt.rwdata ();
1855 float *prz = rz.rwdata ();
1858 if (calc_cond && anorm < 0.0)
1859 anorm = norm1 (atmp);
1865 if (octave::math::isnan (anorm) || octave::math::isinf (anorm))
1870 nr, pipvt, tmp_info));
1882 sing_handler (rcon);
1884 octave::warn_singular_matrix ();
1894 F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
1897 F77_CHAR_ARG_LEN (1)));
1904 if (is_singular (rcon) || octave::math::isnan (rcon))
1907 sing_handler (rcon);
1909 octave::warn_singular_matrix (rcon);
1919 F77_XFCN (cgetrs, CGETRS, (F77_CONST_CHAR_ARG2 (&job, 1),
1922 F77_CHAR_ARG_LEN (1)));
1931 if (octave::math::isinf (anorm))
1947 return solve (mattype, b, info, rcon,
nullptr);
1955 return solve (mattype, b, info, rcon,
nullptr);
1962 return solve (mattype, b, info, rcon,
nullptr);
1968 solve_singularity_handler sing_handler,
1972 return solve (mattype, tmp, info, rcon, sing_handler, singular_fallback,
1982 return solve (mattype, b, info, rcon,
nullptr);
1990 return solve (mattype, b, info, rcon,
nullptr);
1997 return solve (mattype, b, info, rcon,
nullptr);
2003 solve_singularity_handler sing_handler,
2004 bool singular_fallback,
2008 int typ = mattype.
type ();
2011 typ = mattype.
type (*
this);
2015 retval = utsolve (mattype, b, info, rcon, sing_handler,
true, transt);
2018 retval = ltsolve (mattype, b, info, rcon, sing_handler,
true, transt);
2023 retval =
hermitian ().
solve (mattype, b, info, rcon, sing_handler,
2026 retval = fsolve (mattype, b, info, rcon, sing_handler,
true);
2028 (*current_liboctave_error_handler) (
"unknown matrix type");
2034 retval =
lssolve (b, info, rank, rcon);
2067 solve_singularity_handler sing_handler,
2071 sing_handler, transt);
2080 return solve (mattype, b, info, rcon,
nullptr);
2089 return solve (mattype, b, info, rcon,
nullptr);
2097 return solve (mattype, b, info, rcon,
nullptr);
2104 solve_singularity_handler sing_handler,
2109 tmp =
solve (mattype, tmp, info, rcon, sing_handler,
true, transt);
2118 return solve (b, info, rcon,
nullptr);
2125 return solve (b, info, rcon,
nullptr);
2132 return solve (b, info, rcon,
nullptr);
2138 solve_singularity_handler sing_handler,
2142 return solve (tmp, info, rcon, sing_handler, transt);
2150 return solve (b, info, rcon,
nullptr);
2158 return solve (b, info, rcon,
nullptr);
2165 return solve (b, info, rcon,
nullptr);
2171 solve_singularity_handler sing_handler,
2175 return solve (mattype, b, info, rcon, sing_handler,
true, transt);
2204 solve_singularity_handler sing_handler,
2215 return solve (b, info, rcon,
nullptr);
2223 return solve (b, info, rcon,
nullptr);
2231 return solve (b, info, rcon,
nullptr);
2238 solve_singularity_handler sing_handler,
2242 return solve (mattype, b, info, rcon, sing_handler, transt);
2283 return lssolve (b, info, rank, rcon);
2292 return lssolve (b, info, rank, rcon);
2300 return lssolve (b, info, rank, rcon);
2317 (*current_liboctave_error_handler)
2318 (
"matrix dimension mismatch solution of linear equations");
2320 if (m == 0 || n == 0 || b_nc == 0)
2324 F77_INT minmn = (m < n ? m : n);
2325 F77_INT maxmn = (m > n ? m : n);
2332 for (
F77_INT j = 0; j < nrhs; j++)
2333 for (
F77_INT i = 0; i < m; i++)
2334 retval.
elem (i, j) = b.
elem (i, j);
2353 F77_CONST_CHAR_ARG2 (
" ", 1),
2355 F77_CHAR_ARG_LEN (6)
2356 F77_CHAR_ARG_LEN (1));
2360 F77_CONST_CHAR_ARG2 (
" ", 1),
2361 m, n, nrhs, -1, mnthr
2362 F77_CHAR_ARG_LEN (6)
2363 F77_CHAR_ARG_LEN (1));
2368 float dminmn =
static_cast<float> (minmn);
2369 float dsmlsizp1 =
static_cast<float> (smlsiz+1);
2370 float tmp = octave::math::log2 (dminmn / dsmlsizp1);
2376 F77_INT lrwork = minmn*(10 + 2*smlsiz + 8*nlvl)
2378 + std::max ((smlsiz+1)*(smlsiz+1),
2379 n*(1+nrhs) + 2*nrhs);
2383 float *prwork = rwork.
rwdata ();
2385 F77_INT liwork = 3 * minmn * nlvl + 11 * minmn;
2397 lwork, prwork, piwork, tmp_info));
2406 if (n > m && n >= mnthr)
2419 const F77_INT lworkaround = 4*m + m*m + addend;
2421 if (std::real (work(0)) < lworkaround)
2422 work(0) = lworkaround;
2426 F77_INT lworkaround = 2*m + m*nrhs;
2428 if (std::real (work(0)) < lworkaround)
2429 work(0) = lworkaround;
2432 lwork =
static_cast<F77_INT> (std::real (work(0)));
2435 float anorm = norm1 (*
this);
2437 if (octave::math::isinf (anorm))
2442 else if (octave::math::isnan (anorm))
2444 rcon = octave::numeric_limits<float>::NaN ();
2446 octave::numeric_limits<float>::NaN ());
2452 maxmn, ps, rcon, tmp_rank,
2454 lwork, prwork, piwork, tmp_info));
2459 if (s.
elem (0) == 0.0)
2462 rcon = s.
elem (minmn - 1) / s.
elem (0);
2510 return lssolve (b, info, rank, rcon);
2519 return lssolve (b, info, rank, rcon);
2528 return lssolve (b, info, rank, rcon);
2547 (*current_liboctave_error_handler)
2548 (
"matrix dimension mismatch solution of linear equations");
2550 if (m == 0 || n == 0)
2554 F77_INT minmn = (m < n ? m : n);
2555 F77_INT maxmn = (m > n ? m : n);
2562 for (
F77_INT i = 0; i < m; i++)
2582 F77_CONST_CHAR_ARG2 (
" ", 1),
2584 F77_CHAR_ARG_LEN (6)
2585 F77_CHAR_ARG_LEN (1));
2590 float dminmn =
static_cast<float> (minmn);
2591 float dsmlsizp1 =
static_cast<float> (smlsiz+1);
2592 float tmp = octave::math::log2 (dminmn / dsmlsizp1);
2598 F77_INT lrwork = minmn*(10 + 2*smlsiz + 8*nlvl)
2599 + 3*smlsiz*nrhs + (smlsiz+1)*(smlsiz+1);
2603 float *prwork = rwork.
rwdata ();
2605 F77_INT liwork = 3 * minmn * nlvl + 11 * minmn;
2617 lwork, prwork, piwork, tmp_info));
2622 lwork =
static_cast<F77_INT> (std::real (work(0)));
2629 maxmn, ps, rcon, tmp_rank,
2631 prwork, piwork, tmp_info));
2638 if (s.
elem (0) == 0.0)
2641 rcon = s.
elem (minmn - 1) / s.
elem (0);
2680 F77_XFCN (cgemm, CGEMM, (F77_CONST_CHAR_ARG2 (
"N", 1),
2681 F77_CONST_CHAR_ARG2 (
"N", 1),
2684 F77_CHAR_ARG_LEN (1)
2685 F77_CHAR_ARG_LEN (1)));
2702 if (nr != a_nr || nc != a_nc)
2703 octave::err_nonconformant (
"operator +=", nr, nc, a_nr, a_nc);
2720 if (nr != a_nr || nc != a_nc)
2721 octave::err_nonconformant (
"operator -=", nr, nc, a_nr, a_nc);
2738 if (nr != a_nr || nc != a_nc)
2739 octave::err_nonconformant (
"operator +=", nr, nc, a_nr, a_nc);
2756 if (nr != a_nr || nc != a_nc)
2757 octave::err_nonconformant (
"operator -=", nr, nc, a_nr, a_nc);
2776 if (nr != a_nr || nc != a_nc)
2777 octave::err_nonconformant (
"operator +=", nr, nc, a_nr, a_nc);
2779 if (nr == 0 || nc == 0)
2797 if (nr != a_nr || nc != a_nc)
2798 octave::err_nonconformant (
"operator -=", nr, nc, a_nr, a_nc);
2800 if (nr == 0 || nc == 0)
2873 if (nr == 1 || nc == 1)
2890 if (std::imag (
elem (i, j)) != 0.0)
2909 if (std::imag (
elem (i, j)) != 0.0)
2934 if (nr > 0 && nc > 0)
2947 float abs_min = octave::numeric_limits<float>::NaN ();
2949 for (idx_j = 0; idx_j < nc; idx_j++)
2951 tmp_min =
elem (i, idx_j);
2953 if (! octave::math::isnan (tmp_min))
2955 abs_min = (real_only ? tmp_min.real ()
2956 : std::abs (tmp_min));
2965 if (octave::math::isnan (tmp))
2968 float abs_tmp = (real_only ? tmp.real () : std::abs (tmp));
2970 if (abs_tmp < abs_min)
2978 if (octave::math::isnan (tmp_min))
2980 result.
elem (i) = FloatComplex_NaN_result;
2981 idx_arg.
elem (i) = 0;
2985 result.
elem (i) = tmp_min;
2986 idx_arg.
elem (i) = idx_j;
3009 if (nr > 0 && nc > 0)
3022 float abs_max = octave::numeric_limits<float>::NaN ();
3024 for (idx_j = 0; idx_j < nc; idx_j++)
3026 tmp_max =
elem (i, idx_j);
3028 if (! octave::math::isnan (tmp_max))
3030 abs_max = (real_only ? tmp_max.real ()
3031 : std::abs (tmp_max));
3040 if (octave::math::isnan (tmp))
3043 float abs_tmp = (real_only ? tmp.real () : std::abs (tmp));
3045 if (abs_tmp > abs_max)
3053 if (octave::math::isnan (tmp_max))
3055 result.
elem (i) = FloatComplex_NaN_result;
3056 idx_arg.
elem (i) = 0;
3060 result.
elem (i) = tmp_max;
3061 idx_arg.
elem (i) = idx_j;
3084 if (nr > 0 && nc > 0)
3097 float abs_min = octave::numeric_limits<float>::NaN ();
3099 for (idx_i = 0; idx_i < nr; idx_i++)
3101 tmp_min =
elem (idx_i, j);
3103 if (! octave::math::isnan (tmp_min))
3105 abs_min = (real_only ? tmp_min.real ()
3106 : std::abs (tmp_min));
3115 if (octave::math::isnan (tmp))
3118 float abs_tmp = (real_only ? tmp.real () : std::abs (tmp));
3120 if (abs_tmp < abs_min)
3128 if (octave::math::isnan (tmp_min))
3130 result.
elem (j) = FloatComplex_NaN_result;
3131 idx_arg.
elem (j) = 0;
3135 result.
elem (j) = tmp_min;
3136 idx_arg.
elem (j) = idx_i;
3159 if (nr > 0 && nc > 0)
3172 float abs_max = octave::numeric_limits<float>::NaN ();
3174 for (idx_i = 0; idx_i < nr; idx_i++)
3176 tmp_max =
elem (idx_i, j);
3178 if (! octave::math::isnan (tmp_max))
3180 abs_max = (real_only ? tmp_max.real ()
3181 : std::abs (tmp_max));
3190 if (octave::math::isnan (tmp))
3193 float abs_tmp = (real_only ? tmp.real () : std::abs (tmp));
3195 if (abs_tmp > abs_max)
3203 if (octave::math::isnan (tmp_max))
3205 result.
elem (j) = FloatComplex_NaN_result;
3206 idx_arg.
elem (j) = 0;
3210 result.
elem (j) = tmp_max;
3211 idx_arg.
elem (j) = idx_i;
3229 octave::write_value<Complex> (os, a.
elem (i, j));
3242 if (nr > 0 && nc > 0)
3248 tmp = octave::read_value<FloatComplex> (is);
3250 a.
elem (i, j) = tmp;
3289 octave::math::schur<FloatComplexMatrix> as (a,
"U");
3290 octave::math::schur<FloatComplexMatrix> bs (b,
"U");
3315 F77_XFCN (ctrsyl, CTRSYL, (F77_CONST_CHAR_ARG2 (
"N", 1),
3316 F77_CONST_CHAR_ARG2 (
"N", 1),
3319 F77_CHAR_ARG_LEN (1)
3320 F77_CHAR_ARG_LEN (1)));
3371get_blas_trans_arg (
bool trans,
bool conj)
3373 return trans ? (
conj ?
'C' :
'T') :
'N';
3396 octave::err_nonconformant (
"operator *", a_nr, a_nc, b_nr, b_nc);
3398 if (a_nr == 0 || a_nc == 0 || b_nc == 0)
3400 else if (a.
data () == b.
data () && a_nr == b_nc && tra != trb)
3412 const char ctra = get_blas_trans_arg (tra, cja);
3415 F77_XFCN (cherk, CHERK, (F77_CONST_CHAR_ARG2 (
"U", 1),
3416 F77_CONST_CHAR_ARG2 (&ctra, 1),
3419 F77_CHAR_ARG_LEN (1)
3420 F77_CHAR_ARG_LEN (1)));
3421 for (
F77_INT j = 0; j < a_nr; j++)
3422 for (
F77_INT i = 0; i < j; i++)
3423 retval.
xelem (j, i) = octave::math::conj (retval.
xelem (i, j));
3427 F77_XFCN (csyrk, CSYRK, (F77_CONST_CHAR_ARG2 (
"U", 1),
3428 F77_CONST_CHAR_ARG2 (&ctra, 1),
3431 F77_CHAR_ARG_LEN (1)
3432 F77_CHAR_ARG_LEN (1)));
3433 for (
F77_INT j = 0; j < a_nr; j++)
3434 for (
F77_INT i = 0; i < j; i++)
3450 if (b_nc == 1 && a_nr == 1)
3457 if (cja) *c = octave::math::conj (*c);
3468 else if (b_nc == 1 && ! cjb)
3470 const char ctra = get_blas_trans_arg (tra, cja);
3471 F77_XFCN (cgemv, CGEMV, (F77_CONST_CHAR_ARG2 (&ctra, 1),
3474 F77_CHAR_ARG_LEN (1)));
3476 else if (a_nr == 1 && ! cja && ! cjb)
3478 const char crevtrb = get_blas_trans_arg (! trb, cjb);
3479 F77_XFCN (cgemv, CGEMV, (F77_CONST_CHAR_ARG2 (&crevtrb, 1),
3482 F77_CHAR_ARG_LEN (1)));
3486 const char ctra = get_blas_trans_arg (tra, cja);
3487 const char ctrb = get_blas_trans_arg (trb, cjb);
3488 F77_XFCN (cgemm, CGEMM, (F77_CONST_CHAR_ARG2 (&ctra, 1),
3489 F77_CONST_CHAR_ARG2 (&ctrb, 1),
3492 F77_CHAR_ARG_LEN (1)
3493 F77_CHAR_ARG_LEN (1)));
3503 return xgemm (a, b);
3509#define EMPTY_RETURN_CHECK(T) \
3510 if (nr == 0 || nc == 0) \
3527 result(i, j) = octave::math::min (c, m(i, j));
3546 (*current_liboctave_error_handler)
3547 (
"two-arg min requires same size arguments");
3555 bool columns_are_real_only =
true;
3559 if (std::imag (a(i, j)) != 0.0 || std::imag (b(i, j)) != 0.0)
3561 columns_are_real_only =
false;
3566 if (columns_are_real_only)
3569 result(i, j) = octave::math::min (std::real (a(i, j)),
3570 std::real (b(i, j)));
3577 result(i, j) = octave::math::min (a(i, j), b(i, j));
3599 result(i, j) = octave::math::max (c, m(i, j));
3618 (*current_liboctave_error_handler)
3619 (
"two-arg max requires same size arguments");
3627 bool columns_are_real_only =
true;
3631 if (std::imag (a(i, j)) != 0.0 || std::imag (b(i, j)) != 0.0)
3633 columns_are_real_only =
false;
3638 if (columns_are_real_only)
3643 result(i, j) = octave::math::max (std::real (a(i, j)),
3644 std::real (b(i, j)));
3652 result(i, j) = octave::math::max (a(i, j), b(i, j));
3668 if (x2.
numel () != m)
3669 (*current_liboctave_error_handler)
3670 (
"linspace: vectors must be of equal length");
3676 retval.
clear (m, 0);
3680 retval.clear (m, n);
3682 retval.insert (
linspace (x1(i), x2(i), n), i, 0);
base_det< FloatComplex > FloatComplexDET
N Dimensional Array with copy-on-write semantics.
T & xelem(octave_idx_type n)
Size of the specified dimension.
Array< T, Alloc > index(const octave::idx_vector &i) const
Indexing without resizing.
bool issquare() const
Size of the specified dimension.
T & elem(octave_idx_type n)
Size of the specified dimension.
octave_idx_type rows() const
void resize(const dim_vector &dv, const T &rfv)
Size of the specified dimension.
Array< T, Alloc > & insert(const Array< T, Alloc > &a, const Array< octave_idx_type > &idx)
Insert an array into another at a specified position.
octave_idx_type columns() const
octave_idx_type cols() const
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.
octave_idx_type rows() const
octave_idx_type length() const
T elem(octave_idx_type r, octave_idx_type c) const
octave_idx_type cols() const
FloatColumnVector extract(octave_idx_type r1, octave_idx_type r2) const
void resize(octave_idx_type n, const FloatComplex &rfv=FloatComplex(0))
FloatComplexColumnVector row_min() const
FloatComplexMatrix hermitian() const
FloatComplexMatrix ifourier() const
bool row_is_real_only(octave_idx_type) const
boolMatrix all(int dim=-1) const
FloatComplexMatrix sumsq(int dim=-1) const
FloatComplexMatrix pseudo_inverse(float tol=0.0) const
FloatComplexMatrix extract(octave_idx_type r1, octave_idx_type c1, octave_idx_type r2, octave_idx_type c2) const
FloatComplexMatrix lssolve(const FloatMatrix &b) const
FloatComplexMatrix & operator+=(const FloatDiagMatrix &a)
FloatComplexRowVector row(octave_idx_type i) const
bool operator!=(const FloatComplexMatrix &a) const
FloatComplexColumnVector column(octave_idx_type i) const
FloatComplexMatrix fourier2d() const
FloatComplexMatrix stack(const FloatMatrix &a) const
FloatComplexMatrix cumsum(int dim=-1) const
FloatComplexMatrix & insert(const FloatMatrix &a, octave_idx_type r, octave_idx_type c)
bool operator==(const FloatComplexMatrix &a) const
FloatComplexMatrix diag(octave_idx_type k=0) const
void resize(octave_idx_type nr, octave_idx_type nc, const FloatComplex &rfv=FloatComplex(0))
FloatComplexMatrix ifourier2d() const
FloatComplexMatrix transpose() const
FloatComplexMatrix fourier() const
FloatComplexMatrix sum(int dim=-1) const
FloatComplexMatrix()=default
friend FloatComplexMatrix conj(const FloatComplexMatrix &a)
FloatComplexRowVector column_max() const
FloatComplexMatrix solve(MatrixType &mattype, const FloatMatrix &b) const
FloatComplexMatrix & operator-=(const FloatDiagMatrix &a)
boolMatrix any(int dim=-1) const
FloatComplexRowVector column_min() const
FloatComplexMatrix & fill(float val)
FloatComplexDET determinant() const
bool column_is_real_only(octave_idx_type) const
FloatComplexMatrix inverse() const
FloatComplexMatrix append(const FloatMatrix &a) const
FloatComplexMatrix cumprod(int dim=-1) const
FloatComplexColumnVector row_max() const
FloatComplexMatrix prod(int dim=-1) const
FloatComplexMatrix extract_n(octave_idx_type r1, octave_idx_type c1, octave_idx_type nr, octave_idx_type nc) const
FloatComplexNDArray sum(int dim=-1) const
FloatComplexNDArray cumprod(int dim=-1) const
FloatComplexNDArray sumsq(int dim=-1) const
FloatComplexNDArray prod(int dim=-1) const
FloatComplexNDArray cumsum(int dim=-1) const
boolNDArray all(int dim=-1) const
boolNDArray any(int dim=-1) const
FloatComplexNDArray diag(octave_idx_type k=0) const
void resize(octave_idx_type n, const FloatComplex &rfv=FloatComplex(0))
FloatDiagMatrix inverse() const
FloatColumnVector extract_diag(octave_idx_type k=0) const
FloatMatrix sum(int dim=-1) const
FloatRowVector row(octave_idx_type i) const
Template for two dimensional diagonal array with math operators.
void mark_as_unsymmetric()
int type(bool quiet=true)
void mark_as_rectangular()
Vector representing the dimensions (size) of an Array.
ColumnVector real(const ComplexColumnVector &a)
ColumnVector imag(const ComplexColumnVector &a)
#define F77_CONST_CMPLX_ARG(x)
#define F77_XFCN(f, F, args)
octave_f77_int_type F77_INT
FloatComplexMatrix Sylvester(const FloatComplexMatrix &a, const FloatComplexMatrix &b, const FloatComplexMatrix &c)
FloatComplexMatrix xgemm(const FloatComplexMatrix &a, const FloatComplexMatrix &b, blas_trans_type transa, blas_trans_type transb)
FloatComplexMatrix operator*(const FloatColumnVector &v, const FloatComplexRowVector &a)
FloatComplexMatrix max(const FloatComplex &c, const FloatComplexMatrix &m)
std::ostream & operator<<(std::ostream &os, const FloatComplexMatrix &a)
FloatComplexMatrix linspace(const FloatComplexColumnVector &x1, const FloatComplexColumnVector &x2, octave_idx_type n)
#define EMPTY_RETURN_CHECK(T)
FloatComplexMatrix min(const FloatComplex &c, const FloatComplexMatrix &m)
FloatComplexMatrix conj(const FloatComplexMatrix &a)
FloatComplexMatrix Givens(const FloatComplex &x, const FloatComplex &y)
std::istream & operator>>(std::istream &is, FloatComplexMatrix &a)
double norm(const ColumnVector &v)
void scale(Matrix &m, double x, double y, double z)
OCTAVE_NORETURN liboctave_error_handler current_liboctave_error_handler
F77_RET_T const F77_INT const F77_INT const F77_INT const F77_DBLE const F77_DBLE F77_INT F77_DBLE * V
F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE * d
F77_RET_T const F77_DBLE * x
char get_blas_char(blas_trans_type transt)
void mx_inline_sub2(std::size_t n, R *r, const X *x)
void mx_inline_add2(std::size_t n, R *r, const X *x)
bool mx_inline_equal(std::size_t n, const T1 *x, const T2 *y)
#define MM_BOOL_OPS(M1, M2)
#define MM_CMP_OPS(M1, M2)
#define SM_BOOL_OPS(S, M)
#define MS_BOOL_OPS(M, S)
std::complex< float > FloatComplex
#define OCTAVE_LOCAL_BUFFER(T, buf, size)
subroutine xcdotc(n, zx, incx, zy, incy, retval)
subroutine xcdotu(n, zx, incx, zy, incy, retval)
F77_RET_T F77_FUNC(xerbla, XERBLA)(F77_CONST_CHAR_ARG_DEF(s_arg
subroutine xilaenv(ispec, name, opts, n1, n2, n3, n4, retval)