133 return !(*
this == a);
164 if (r < 0 || r >=
rows () || c < 0 || c + a_len >
cols ())
165 (*current_liboctave_error_handler) (
"range error for insert");
183 if (r < 0 || r + a_len >
rows () || c < 0 || c >=
cols ())
184 (*current_liboctave_error_handler) (
"range error for insert");
203 if (r < 0 || r + a_nr >
rows () || c < 0 || c + a_nc >
cols ())
204 (*current_liboctave_error_handler) (
"range error for insert");
206 fill (0.0, r, c, r + a_nr - 1, c + a_nc - 1);
227 if (nr > 0 && nc > 0)
246 if (r1 < 0 || r2 < 0 || c1 < 0 || c2 < 0
247 || r1 >= nr || r2 >= nr || c1 >= nc || c2 >= nc)
248 (*current_liboctave_error_handler) (
"range error for fill");
250 if (r1 > r2) { std::swap (r1, r2); }
251 if (c1 > c2) { std::swap (c1, c2); }
253 if (r2 >= r1 && c2 >= c1)
271 (*current_liboctave_error_handler) (
"row dimension mismatch for append");
275 retval.
insert (*
this, 0, 0);
276 retval.
insert (a, 0, nc_insert);
286 (*current_liboctave_error_handler) (
"row dimension mismatch for append");
290 retval.
insert (*
this, 0, 0);
291 retval.
insert (a, 0, nc_insert);
300 if (nr != a.
numel ())
301 (*current_liboctave_error_handler) (
"row dimension mismatch for append");
304 Matrix retval (nr, nc + 1);
305 retval.
insert (*
this, 0, 0);
306 retval.
insert (a, 0, nc_insert);
316 (*current_liboctave_error_handler) (
"row dimension mismatch for append");
320 retval.
insert (*
this, 0, 0);
321 retval.
insert (a, 0, nc_insert);
331 (*current_liboctave_error_handler) (
"column dimension mismatch for stack");
335 retval.
insert (*
this, 0, 0);
336 retval.
insert (a, nr_insert, 0);
345 if (nc != a.
numel ())
346 (*current_liboctave_error_handler) (
"column dimension mismatch for stack");
349 Matrix retval (nr + 1, nc);
350 retval.
insert (*
this, 0, 0);
351 retval.
insert (a, nr_insert, 0);
361 (*current_liboctave_error_handler) (
"column dimension mismatch for stack");
365 retval.
insert (*
this, 0, 0);
366 retval.
insert (a, nr_insert, 0);
376 (*current_liboctave_error_handler) (
"column dimension mismatch for stack");
380 retval.
insert (*
this, 0, 0);
381 retval.
insert (a, nr_insert, 0);
401 if (r1 > r2) { std::swap (r1, r2); }
402 if (c1 > c2) { std::swap (c1, c2); }
404 return index (octave::idx_vector (r1, r2+1), octave::idx_vector (c1, c2+1));
411 return index (octave::idx_vector (r1, r1 + nr), octave::idx_vector (c1, c1 + nc));
419 return index (octave::idx_vector (i), octave::idx_vector::colon);
425 return index (octave::idx_vector::colon, octave::idx_vector (i));
438 double sum = colsum.
xelem (i);
439 if (octave::math::isinf (sum) || octave::math::isnan (sum))
445 anorm = std::max (anorm, sum);
454is_singular (
const double rcond)
456 return (std::abs (rcond) <= std::numeric_limits<double>::epsilon ());
465 return inverse (mattype, info, rcon,
false,
false);
473 return inverse (mattype, info, rcon,
false,
false);
478 bool force,
bool calc_cond)
const
481 return inverse (mattype, info, rcon, force, calc_cond);
489 return inverse (mattype, info, rcon,
false,
false);
496 return inverse (mattype, info, rcon,
false,
false);
501 bool force,
bool calc_cond)
const
508 if (nr != nc || nr == 0 || nc == 0)
509 (*current_liboctave_error_handler) (
"inverse requires square matrix");
511 int typ = mattype.
type ();
515 double *tmp_data = retval.
rwdata ();
519 F77_XFCN (dtrtri, DTRTRI, (F77_CONST_CHAR_ARG2 (&uplo, 1),
520 F77_CONST_CHAR_ARG2 (&udiag, 1),
521 nr, tmp_data, nr, tmp_info
523 F77_CHAR_ARG_LEN (1)));
539 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&job, 1),
540 F77_CONST_CHAR_ARG2 (&uplo, 1),
541 F77_CONST_CHAR_ARG2 (&udiag, 1),
542 nr, tmp_data, nr, rcon,
543 work, iwork, dtrcon_info
546 F77_CHAR_ARG_LEN (1)));
548 if (dtrcon_info != 0)
552 if (info == -1 && ! force)
560 bool force,
bool calc_cond)
const
567 if (nr != nc || nr == 0 || nc == 0)
568 (*current_liboctave_error_handler) (
"inverse requires square matrix");
571 F77_INT *pipvt = ipvt.rwdata ();
574 double *tmp_data = retval.
rwdata ();
582 F77_XFCN (dgetri, DGETRI, (nc, tmp_data, nr, pipvt,
583 z.rwdata (), lwork, tmp_info));
585 lwork =
static_cast<F77_INT> (z(0));
586 lwork = (lwork < 4 * nc ? 4 * nc : lwork);
588 double *pz = z.rwdata ();
596 anorm = norm1 (retval);
598 F77_XFCN (dgetrf, DGETRF, (nc, nc, tmp_data, nr, pipvt, tmp_info));
608 if (octave::math::isnan (anorm))
609 rcon = octave::numeric_limits<double>::NaN ();
618 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
619 nc, tmp_data, nr, anorm,
620 rcon, pz, piz, dgecon_info
621 F77_CHAR_ARG_LEN (1)));
623 if (dgecon_info != 0)
628 if (info == -1 && ! force)
634 F77_XFCN (dgetri, DGETRI, (nc, tmp_data, nr, pipvt,
635 pz, lwork, dgetri_info));
637 if (dgetri_info != 0)
649 bool force,
bool calc_cond)
const
651 int typ = mattype.
type (
false);
655 typ = mattype.
type (*
this);
662 double scalar = this->
elem (0);
663 if (octave::math::isfinite (scalar) && scalar != 0)
665 else if (octave::math::isinf (scalar) || scalar == 0)
668 rcon = octave::numeric_limits<double>::NaN ();
672 ret = tinverse (mattype, info, rcon, force, calc_cond);
677 octave::math::chol<Matrix>
chol (*
this, info,
true, calc_cond);
691 ret = finverse (mattype, info, rcon, force, calc_cond);
693 if ((calc_cond || mattype.
ishermitian ()) && rcon == 0.0)
695 octave::numeric_limits<double>::Inf ());
704 octave::math::svd<Matrix> result (*
this,
705 octave::math::svd<Matrix>::Type::economy);
708 Matrix U = result.left_singular_matrix ();
709 Matrix V = result.right_singular_matrix ();
719 tol = std::max (nr, nc) * sigma.
elem (0)
720 * std::numeric_limits<double>::epsilon ();
723 tol = std::numeric_limits<double>::min ();
726 while (r >= 0 && sigma.
elem (r) < tol)
730 return Matrix (nc, nr, 0.0);
740#if defined (HAVE_FFTW)
745 std::size_t nr =
rows ();
746 std::size_t nc =
cols ();
750 std::size_t npts, nsamples;
752 if (nr == 1 || nc == 1)
754 npts = (nr > nc ? nr : nc);
763 const double *in (
data ());
766 octave::fftw::fft (in, out, npts, nsamples);
774 std::size_t nr =
rows ();
775 std::size_t nc =
cols ();
779 std::size_t npts, nsamples;
781 if (nr == 1 || nc == 1)
783 npts = (nr > nc ? nr : nc);
796 octave::fftw::ifft (in, out, npts, nsamples);
806 const double *in =
data ();
808 octave::fftw::fftNd (in, retval.
rwdata (), 2, dv);
821 octave::fftw::ifftNd (out, out, 2, dv);
831 (*current_liboctave_error_handler)
832 (
"support for FFTW was unavailable or disabled when liboctave was built");
840 (*current_liboctave_error_handler)
841 (
"support for FFTW was unavailable or disabled when liboctave was built");
849 (*current_liboctave_error_handler)
850 (
"support for FFTW was unavailable or disabled when liboctave was built");
858 (*current_liboctave_error_handler)
859 (
"support for FFTW was unavailable or disabled when liboctave was built");
885 return determinant (mattype, info, rcon, calc_cond);
901 (*current_liboctave_error_handler) (
"matrix must be square");
903 int typ = mattype.
type ();
909 typ = mattype.
type (*
this);
915 for (
F77_INT i = 0; i < nc; i++)
916 retval *=
elem (i, i);
921 double *tmp_data = atmp.
rwdata ();
926 anorm = norm1 (*
this);
931 F77_XFCN (dpotrf, DPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr,
932 tmp_data, nr, tmp_info
933 F77_CHAR_ARG_LEN (1)));
952 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
953 nr, tmp_data, nr, anorm,
954 rcon, pz, piz, tmp_info
955 F77_CHAR_ARG_LEN (1)));
963 for (
F77_INT i = 0; i < nc; i++)
964 retval *= atmp(i, i);
966 retval = retval.
square ();
970 (*current_liboctave_error_handler) (
"det: invalid dense matrix type");
978 double *tmp_data = atmp.
rwdata ();
986 anorm = norm1 (*
this);
988 F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, tmp_info));
1006 double *pz = z.
rwdata ();
1010 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
1011 nc, tmp_data, nr, anorm,
1012 rcon, pz, piz, tmp_info
1013 F77_CHAR_ARG_LEN (1)));
1025 for (
F77_INT i = 0; i < nc; i++)
1027 double c = atmp(i, i);
1028 retval *= (ipvt(i) != (i+1)) ? -c : c;
1041 return rcond (mattype);
1047 double rcon = octave::numeric_limits<double>::NaN ();
1052 (*current_liboctave_error_handler) (
"matrix must be square");
1054 if (nr == 0 || nc == 0)
1055 rcon = octave::numeric_limits<double>::Inf ();
1058 int typ = mattype.
type ();
1061 typ = mattype.
type (*
this);
1066 const double *tmp_data =
data ();
1073 double *pz = z.
rwdata ();
1077 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&
norm, 1),
1078 F77_CONST_CHAR_ARG2 (&uplo, 1),
1079 F77_CONST_CHAR_ARG2 (&dia, 1),
1080 nr, tmp_data, nr, rcon,
1082 F77_CHAR_ARG_LEN (1)
1083 F77_CHAR_ARG_LEN (1)
1084 F77_CHAR_ARG_LEN (1)));
1090 (*current_liboctave_error_handler)
1091 (
"permuted triangular matrix not implemented");
1094 const double *tmp_data =
data ();
1101 double *pz = z.
rwdata ();
1105 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&
norm, 1),
1106 F77_CONST_CHAR_ARG2 (&uplo, 1),
1107 F77_CONST_CHAR_ARG2 (&dia, 1),
1108 nr, tmp_data, nr, rcon,
1110 F77_CHAR_ARG_LEN (1)
1111 F77_CHAR_ARG_LEN (1)
1112 F77_CHAR_ARG_LEN (1)));
1118 (*current_liboctave_error_handler)
1119 (
"permuted triangular matrix not implemented");
1122 double anorm = -1.0;
1130 double *tmp_data = atmp.
rwdata ();
1132 anorm = norm1 (atmp);
1134 F77_XFCN (dpotrf, DPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr,
1136 F77_CHAR_ARG_LEN (1)));
1147 double *pz = z.
rwdata ();
1151 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
1152 nr, tmp_data, nr, anorm,
1154 F77_CHAR_ARG_LEN (1)));
1166 double *tmp_data = atmp.
rwdata ();
1172 anorm = norm1 (atmp);
1175 double *pz = z.
rwdata ();
1179 F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, info));
1189 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
1190 nc, tmp_data, nr, anorm,
1192 F77_CHAR_ARG_LEN (1)));
1208 double& rcon, solve_singularity_handler sing_handler,
1220 (*current_liboctave_error_handler)
1221 (
"matrix dimension mismatch solution of linear equations");
1223 if (nr == 0 || nc == 0 || b_nc == 0)
1224 retval =
Matrix (nc, b_nc, 0.0);
1227 int typ = mattype.
type ();
1230 (*current_liboctave_error_handler) (
"incorrect matrix type");
1236 (*current_liboctave_error_handler)
1237 (
"permuted triangular matrix not implemented");
1239 const double *tmp_data =
data ();
1242 double *result = retval.
rwdata ();
1250 F77_XFCN (dtrtrs, DTRTRS, (F77_CONST_CHAR_ARG2 (&uplo, 1),
1251 F77_CONST_CHAR_ARG2 (&trans, 1),
1252 F77_CONST_CHAR_ARG2 (&dia, 1),
1253 nr, b_nc, tmp_data, nr,
1254 result, nr, tmp_info
1255 F77_CHAR_ARG_LEN (1)
1256 F77_CHAR_ARG_LEN (1)
1257 F77_CHAR_ARG_LEN (1)));
1268 double *pz = z.rwdata ();
1272 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&
norm, 1),
1273 F77_CONST_CHAR_ARG2 (&uplo, 1),
1274 F77_CONST_CHAR_ARG2 (&dia, 1),
1275 nr, tmp_data, nr, rcon,
1277 F77_CHAR_ARG_LEN (1)
1278 F77_CHAR_ARG_LEN (1)
1279 F77_CHAR_ARG_LEN (1)));
1286 if (is_singular (rcon) || octave::math::isnan (rcon))
1291 sing_handler (rcon);
1293 octave::warn_singular_matrix (rcon);
1303 double& rcon, solve_singularity_handler sing_handler,
1315 (*current_liboctave_error_handler)
1316 (
"matrix dimension mismatch solution of linear equations");
1318 if (nr == 0 || nc == 0 || b_nc == 0)
1319 retval =
Matrix (nc, b_nc, 0.0);
1322 int typ = mattype.
type ();
1325 (*current_liboctave_error_handler) (
"incorrect matrix type");
1331 (*current_liboctave_error_handler)
1332 (
"permuted triangular matrix not implemented");
1334 const double *tmp_data =
data ();
1337 double *result = retval.
rwdata ();
1345 F77_XFCN (dtrtrs, DTRTRS, (F77_CONST_CHAR_ARG2 (&uplo, 1),
1346 F77_CONST_CHAR_ARG2 (&trans, 1),
1347 F77_CONST_CHAR_ARG2 (&dia, 1),
1348 nr, b_nc, tmp_data, nr,
1349 result, nr, tmp_info
1350 F77_CHAR_ARG_LEN (1)
1351 F77_CHAR_ARG_LEN (1)
1352 F77_CHAR_ARG_LEN (1)));
1363 double *pz = z.rwdata ();
1367 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&
norm, 1),
1368 F77_CONST_CHAR_ARG2 (&uplo, 1),
1369 F77_CONST_CHAR_ARG2 (&dia, 1),
1370 nr, tmp_data, nr, rcon,
1372 F77_CHAR_ARG_LEN (1)
1373 F77_CHAR_ARG_LEN (1)
1374 F77_CHAR_ARG_LEN (1)));
1381 if (is_singular (rcon) || octave::math::isnan (rcon))
1386 sing_handler (rcon);
1388 octave::warn_singular_matrix (rcon);
1398 double& rcon, solve_singularity_handler sing_handler,
1399 bool calc_cond)
const
1406 if (nr != nc || nr != b.
rows ())
1407 (*current_liboctave_error_handler)
1408 (
"matrix dimension mismatch solution of linear equations");
1410 if (nr == 0 || b.
cols () == 0)
1414 int typ = mattype.
type ();
1417 double anorm = -1.0;
1425 double *tmp_data = atmp.
rwdata ();
1429 anorm = norm1 (atmp);
1433 F77_XFCN (dpotrf, DPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr,
1434 tmp_data, nr, tmp_info
1435 F77_CHAR_ARG_LEN (1)));
1453 double *pz = z.rwdata ();
1457 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
1458 nr, tmp_data, nr, anorm,
1459 rcon, pz, piz, tmp_info
1460 F77_CHAR_ARG_LEN (1)));
1467 if (is_singular (rcon) || octave::math::isnan (rcon))
1472 sing_handler (rcon);
1474 octave::warn_singular_matrix (rcon);
1481 double *result = retval.
rwdata ();
1486 F77_XFCN (dpotrs, DPOTRS, (F77_CONST_CHAR_ARG2 (&job, 1),
1487 nr, b_nc, tmp_data, nr,
1488 result, b_nr, tmp_info
1489 F77_CHAR_ARG_LEN (1)));
1506 F77_INT *pipvt = ipvt.rwdata ();
1509 double *tmp_data = atmp.
rwdata ();
1511 if (calc_cond && anorm < 0.0)
1512 anorm = norm1 (atmp);
1515 double *pz = z.rwdata ();
1521 F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, tmp_info));
1532 sing_handler (rcon);
1534 octave::warn_singular_matrix ();
1544 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
1545 nc, tmp_data, nr, anorm,
1546 rcon, pz, piz, tmp_info
1547 F77_CHAR_ARG_LEN (1)));
1554 if (is_singular (rcon) || octave::math::isnan (rcon))
1557 sing_handler (rcon);
1559 octave::warn_singular_matrix (rcon);
1566 double *result = retval.
rwdata ();
1572 F77_XFCN (dgetrs, DGETRS, (F77_CONST_CHAR_ARG2 (&job, 1),
1573 nr, b_nc, tmp_data, nr,
1574 pipvt, result, b_nr, tmp_info
1575 F77_CHAR_ARG_LEN (1)));
1584 (*current_liboctave_error_handler) (
"incorrect matrix type");
1595 return solve (mattype, b, info, rcon,
nullptr);
1603 return solve (mattype, b, info, rcon,
nullptr);
1610 return solve (mattype, b, info, rcon,
nullptr);
1615 double& rcon, solve_singularity_handler sing_handler,
1619 int typ = mattype.
type ();
1622 typ = mattype.
type (*
this);
1626 retval = utsolve (mattype, b, info, rcon, sing_handler,
true, transt);
1628 retval = ltsolve (mattype, b, info, rcon, sing_handler,
true, transt);
1633 retval = fsolve (mattype, b, info, rcon, sing_handler,
true);
1635 (*current_liboctave_error_handler) (
"unknown matrix type");
1641 retval =
lssolve (b, info, rank, rcon);
1652 return solve (mattype, b, info, rcon,
nullptr);
1660 return solve (mattype, b, info, rcon,
nullptr);
1667 return solve (mattype, b, info, rcon,
nullptr);
1678 double *rd = retval.
rwdata ();
1681 rd[i] = std::real (cmd[i]);
1682 rd[nel+i] = std::imag (cmd[i]);
1688unstack_complex_matrix (
const Matrix& sm)
1694 const double *smd = sm.
data ();
1697 rd[i] =
Complex (smd[i], smd[nel+i]);
1704 solve_singularity_handler sing_handler,
1707 Matrix tmp = stack_complex_matrix (b);
1708 tmp =
solve (mattype, tmp, info, rcon, sing_handler, singular_fallback,
1710 return unstack_complex_matrix (tmp);
1717 return solve (mattype, b, info, rcon);
1725 return solve (mattype, b, info, rcon);
1732 return solve (mattype, b, info, rcon,
nullptr);
1738 solve_singularity_handler sing_handler,
1742 tmp =
solve (mattype, tmp, info, rcon, sing_handler,
true, transt);
1750 return tmp.
solve (mattype, b);
1758 return tmp.
solve (mattype, b, info);
1766 return tmp.
solve (mattype, b, info, rcon);
1772 solve_singularity_handler sing_handler,
1776 return tmp.
solve (mattype, b, info, rcon, sing_handler, transt);
1784 return solve (b, info, rcon,
nullptr);
1791 return solve (b, info, rcon,
nullptr);
1797 return solve (b, info, rcon,
nullptr);
1802 double& rcon, solve_singularity_handler sing_handler,
1806 return solve (mattype, b, info, rcon, sing_handler,
true, transt);
1813 return tmp.
solve (b);
1820 return tmp.
solve (b, info);
1828 return tmp.
solve (b, info, rcon);
1833 solve_singularity_handler sing_handler,
1837 return tmp.
solve (b, info, rcon, sing_handler, transt);
1844 return solve (b, info, rcon);
1851 return solve (b, info, rcon);
1857 return solve (b, info, rcon,
nullptr);
1862 solve_singularity_handler sing_handler,
1866 return solve (mattype, b, info, rcon, sing_handler, transt);
1873 return tmp.
solve (b);
1880 return tmp.
solve (b, info);
1888 return tmp.
solve (b, info, rcon);
1894 solve_singularity_handler sing_handler,
1898 return tmp.
solve (b, info, rcon, sing_handler, transt);
1907 return lssolve (b, info, rank, rcon);
1915 return lssolve (b, info, rank, rcon);
1923 return lssolve (b, info, rank, rcon);
1940 (*current_liboctave_error_handler)
1941 (
"matrix dimension mismatch solution of linear equations");
1943 if (m == 0 || n == 0 || b_nc == 0)
1944 retval =
Matrix (n, b_nc, 0.0);
1947 F77_INT minmn = (m < n ? m : n);
1948 F77_INT maxmn = (m > n ? m : n);
1952 retval =
Matrix (maxmn, nrhs, 0.0);
1954 for (
F77_INT j = 0; j < nrhs; j++)
1955 for (
F77_INT i = 0; i < m; i++)
1956 retval.
elem (i, j) = b.
elem (i, j);
1962 double *tmp_data = atmp.
rwdata ();
1964 double *pretval = retval.
rwdata ();
1966 double *ps = s.
rwdata ();
1975 F77_CONST_CHAR_ARG2 (
" ", 1),
1977 F77_CHAR_ARG_LEN (6)
1978 F77_CHAR_ARG_LEN (1));
1982 F77_CONST_CHAR_ARG2 (
" ", 1),
1983 m, n, nrhs, -1, mnthr
1984 F77_CHAR_ARG_LEN (6)
1985 F77_CHAR_ARG_LEN (1));
1989 double dminmn =
static_cast<double> (minmn);
1990 double dsmlsizp1 =
static_cast<double> (smlsiz+1);
1991 double tmp = octave::math::log2 (dminmn / dsmlsizp1);
1997 F77_INT liwork = 3 * minmn * nlvl + 11 * minmn;
2006 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
2007 ps, rcon, tmp_rank, work.
rwdata (),
2008 lwork, piwork, tmp_info));
2017 if (n > m && n >= mnthr)
2020 = 9*m + 2*m*smlsiz + 8*m*nlvl + m*nrhs + (smlsiz+1)*(smlsiz+1);
2033 if (wlalsd > addend)
2036 const F77_INT lworkaround = 4*m + m*m + addend;
2038 if (work(0) < lworkaround)
2039 work(0) = lworkaround;
2044 = 12*n + 2*n*smlsiz + 8*n*nlvl + n*nrhs + (smlsiz+1)*(smlsiz+1);
2046 if (work(0) < lworkaround)
2047 work(0) = lworkaround;
2050 lwork =
static_cast<F77_INT> (work(0));
2053 double anorm = norm1 (*
this);
2055 if (octave::math::isinf (anorm))
2058 retval =
Matrix (n, b_nc, 0.0);
2060 else if (octave::math::isnan (anorm))
2062 rcon = octave::numeric_limits<double>::NaN ();
2063 retval =
Matrix (n, b_nc, octave::numeric_limits<double>::NaN ());
2067 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval,
2068 maxmn, ps, rcon, tmp_rank,
2075 if (s.
elem (0) == 0.0)
2078 rcon = s.
elem (minmn - 1) / s.
elem (0);
2094 return tmp.
lssolve (b, info, rank, rcon);
2103 return tmp.
lssolve (b, info, rank, rcon);
2112 return tmp.
lssolve (b, info, rank, rcon);
2120 return tmp.
lssolve (b, info, rank, rcon);
2129 return lssolve (b, info, rank, rcon);
2137 return lssolve (b, info, rank, rcon);
2145 return lssolve (b, info, rank, rcon);
2162 (*current_liboctave_error_handler)
2163 (
"matrix dimension mismatch solution of linear equations");
2165 if (m == 0 || n == 0)
2169 F77_INT minmn = (m < n ? m : n);
2170 F77_INT maxmn = (m > n ? m : n);
2177 for (
F77_INT i = 0; i < m; i++)
2184 double *tmp_data = atmp.
rwdata ();
2186 double *pretval = retval.
rwdata ();
2188 double *ps = s.
rwdata ();
2197 F77_CONST_CHAR_ARG2 (
" ", 1),
2199 F77_CHAR_ARG_LEN (6)
2200 F77_CHAR_ARG_LEN (1));
2204 double dminmn =
static_cast<double> (minmn);
2205 double dsmlsizp1 =
static_cast<double> (smlsiz+1);
2206 double tmp = octave::math::log2 (dminmn / dsmlsizp1);
2212 F77_INT liwork = 3 * minmn * nlvl + 11 * minmn;
2221 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
2222 ps, rcon, tmp_rank, work.
rwdata (),
2223 lwork, piwork, tmp_info));
2228 lwork =
static_cast<F77_INT> (work(0));
2231 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval,
2232 maxmn, ps, rcon, tmp_rank,
2241 if (s.
elem (0) == 0.0)
2244 rcon = s.
elem (minmn - 1) / s.
elem (0);
2260 return tmp.
lssolve (b, info, rank, rcon);
2269 return tmp.
lssolve (b, info, rank, rcon);
2278 return tmp.
lssolve (b, info, rank, rcon);
2286 return tmp.
lssolve (b, info, rank, rcon);
2298 if (nr != a_nr || nc != a_nc)
2299 octave::err_nonconformant (
"operator +=", nr, nc, a_nr, a_nc);
2316 if (nr != a_nr || nc != a_nc)
2317 octave::err_nonconformant (
"operator -=", nr, nc, a_nr, a_nc);
2341 double *c = retval.
rwdata ();
2343 F77_XFCN (dgemm, DGEMM, (F77_CONST_CHAR_ARG2 (
"N", 1),
2344 F77_CONST_CHAR_ARG2 (
"N", 1),
2347 F77_CHAR_ARG_LEN (1)
2348 F77_CHAR_ARG_LEN (1)));
2420 if (nr == 1 || nc == 1)
2443 if (nr > 0 && nc > 0)
2452 double tmp_min = octave::numeric_limits<double>::NaN ();
2454 for (idx_j = 0; idx_j < nc; idx_j++)
2456 tmp_min =
elem (i, idx_j);
2458 if (! octave::math::isnan (tmp_min))
2464 double tmp =
elem (i, j);
2466 if (octave::math::isnan (tmp))
2468 else if (tmp < tmp_min)
2475 result.
elem (i) = tmp_min;
2476 idx_arg.
elem (i) = (octave::math::isnan (tmp_min) ? 0 : idx_j);
2498 if (nr > 0 && nc > 0)
2507 double tmp_max = octave::numeric_limits<double>::NaN ();
2509 for (idx_j = 0; idx_j < nc; idx_j++)
2511 tmp_max =
elem (i, idx_j);
2513 if (! octave::math::isnan (tmp_max))
2519 double tmp =
elem (i, j);
2521 if (octave::math::isnan (tmp))
2523 else if (tmp > tmp_max)
2530 result.
elem (i) = tmp_max;
2531 idx_arg.
elem (i) = (octave::math::isnan (tmp_max) ? 0 : idx_j);
2553 if (nr > 0 && nc > 0)
2562 double tmp_min = octave::numeric_limits<double>::NaN ();
2564 for (idx_i = 0; idx_i < nr; idx_i++)
2566 tmp_min =
elem (idx_i, j);
2568 if (! octave::math::isnan (tmp_min))
2574 double tmp =
elem (i, j);
2576 if (octave::math::isnan (tmp))
2578 else if (tmp < tmp_min)
2585 result.
elem (j) = tmp_min;
2586 idx_arg.
elem (j) = (octave::math::isnan (tmp_min) ? 0 : idx_i);
2608 if (nr > 0 && nc > 0)
2617 double tmp_max = octave::numeric_limits<double>::NaN ();
2619 for (idx_i = 0; idx_i < nr; idx_i++)
2621 tmp_max =
elem (idx_i, j);
2623 if (! octave::math::isnan (tmp_max))
2629 double tmp =
elem (i, j);
2631 if (octave::math::isnan (tmp))
2633 else if (tmp > tmp_max)
2640 result.
elem (j) = tmp_max;
2641 idx_arg.
elem (j) = (octave::math::isnan (tmp_max) ? 0 : idx_i);
2656 octave::write_value<double> (os, a.
elem (i, j));
2669 if (nr > 0 && nc > 0)
2675 tmp = octave::read_value<double> (is);
2677 a.
elem (i, j) = tmp;
2689 double cc, s, temp_r;
2691 F77_FUNC (dlartg, DLARTG) (
x, y, cc, s, temp_r);
2712 octave::math::schur<Matrix> as (a,
"U");
2713 octave::math::schur<Matrix> bs (b,
"U");
2717 Matrix ua = as.unitary_schur_matrix ();
2718 Matrix sch_a = as.schur_matrix ();
2720 Matrix ub = bs.unitary_schur_matrix ();
2721 Matrix sch_b = bs.schur_matrix ();
2733 double *pa = sch_a.
rwdata ();
2734 double *pb = sch_b.
rwdata ();
2735 double *px = cx.
rwdata ();
2737 F77_XFCN (dtrsyl, DTRSYL, (F77_CONST_CHAR_ARG2 (
"N", 1),
2738 F77_CONST_CHAR_ARG2 (
"N", 1),
2739 1, a_nr, b_nr, pa, a_nr, pb,
2740 b_nr, px, a_nr,
scale, info
2741 F77_CHAR_ARG_LEN (1)
2742 F77_CHAR_ARG_LEN (1)));
2778get_blas_trans_arg (
bool trans)
2780 return trans ?
'T' :
'N';
2801 octave::err_nonconformant (
"operator *", a_nr, a_nc, b_nr, b_nc);
2803 if (a_nr == 0 || a_nc == 0 || b_nc == 0)
2804 retval =
Matrix (a_nr, b_nc, 0.0);
2805 else if (a.
data () == b.
data () && a_nr == b_nc && tra != trb)
2809 retval =
Matrix (a_nr, b_nc);
2810 double *c = retval.
rwdata ();
2812 const char ctra = get_blas_trans_arg (tra);
2813 F77_XFCN (dsyrk, DSYRK, (F77_CONST_CHAR_ARG2 (
"U", 1),
2814 F77_CONST_CHAR_ARG2 (&ctra, 1),
2816 a.
data (), lda, 0.0, c, a_nr
2817 F77_CHAR_ARG_LEN (1)
2818 F77_CHAR_ARG_LEN (1)));
2819 for (
int j = 0; j < a_nr; j++)
2820 for (
int i = 0; i < j; i++)
2831 retval =
Matrix (a_nr, b_nc);
2832 double *c = retval.
rwdata ();
2840 const char ctra = get_blas_trans_arg (tra);
2841 F77_XFCN (dgemv, DGEMV, (F77_CONST_CHAR_ARG2 (&ctra, 1),
2842 lda, tda, 1.0, a.
data (), lda,
2843 b.
data (), 1, 0.0, c, 1
2844 F77_CHAR_ARG_LEN (1)));
2849 const char crevtrb = get_blas_trans_arg (! trb);
2850 F77_XFCN (dgemv, DGEMV, (F77_CONST_CHAR_ARG2 (&crevtrb, 1),
2851 ldb, tdb, 1.0, b.
data (), ldb,
2852 a.
data (), 1, 0.0, c, 1
2853 F77_CHAR_ARG_LEN (1)));
2857 const char ctra = get_blas_trans_arg (tra);
2858 const char ctrb = get_blas_trans_arg (trb);
2859 F77_XFCN (dgemm, DGEMM, (F77_CONST_CHAR_ARG2 (&ctra, 1),
2860 F77_CONST_CHAR_ARG2 (&ctrb, 1),
2861 a_nr, b_nc, a_nc, 1.0, a.
data (),
2862 lda, b.
data (), ldb, 0.0, c, a_nr
2863 F77_CHAR_ARG_LEN (1)
2864 F77_CHAR_ARG_LEN (1)));
2874 return xgemm (a, b);
2879#define EMPTY_RETURN_CHECK(T) \
2880 if (nr == 0 || nc == 0) \
2897 result(i, j) = octave::math::min (
d, m(i, j));
2917 result(i, j) = octave::math::min (m(i, j),
d);
2930 (*current_liboctave_error_handler)
2931 (
"two-arg min requires same size arguments");
2941 result(i, j) = octave::math::min (a(i, j), b(i, j));
2961 result(i, j) = octave::math::max (
d, m(i, j));
2981 result(i, j) = octave::math::max (m(i, j),
d);
2994 (*current_liboctave_error_handler)
2995 (
"two-arg max requires same size arguments");
3005 result(i, j) = octave::math::max (a(i, j), b(i, j));
3019 if (x2.
numel () != m)
3020 (*current_liboctave_error_handler)
3021 (
"linspace: vectors must be of equal length");
3027 retval.
clear (m, 0);
3031 retval.clear (m, n);
3033 retval.insert (
linspace (x1(i), x2(i), n), i, 0);