26#if defined (HAVE_CONFIG_H)
58 : m_q (q_arg), m_r (r_arg)
66 if (! (q_nc == r_nr && (q_nr == q_nc || (q_nr > q_nc && r_nr == r_nc))))
67 (*current_liboctave_error_handler) (
"QR dimensions mismatch");
76 if (! m_q.isempty () && m_q.issquare ())
78 else if (m_q.rows () > m_q.cols () && m_r.issquare ())
96 if (m_r(i, i) ==
ELT_T ())
106#if ! defined (HAVE_QRUPDATE)
113 static bool warned =
false;
117 (*current_liboctave_warning_with_id_handler)
118 (
"Octave:missing-dependency",
119 "In this version of Octave, QR & Cholesky updating routines "
120 "simply update the matrix and recalculate factorizations. "
121 "To use fast algorithms, link Octave with the qrupdate library. "
122 "See <http://sourceforge.net/projects/qrupdate>.");
137 if (u.numel () != m || v.numel () != n)
138 (*current_liboctave_error_handler) (
"qrupdate: dimensions mismatch");
140 init (m_q*m_r + T (u) * T (v).hermitian (), get_type ());
152 if (u.rows () != m || v.rows () != n || u.cols () != v.cols ())
153 (*current_liboctave_error_handler) (
"qrupdate: dimensions mismatch");
155 init (m_q*m_r + u * v.hermitian (), get_type ());
158template <
typename T,
typename CV_T>
163 T retval (a.rows (), a.cols () + 1);
164 retval.assign (idx_vector::colon,
idx_vector (0, i),
166 retval.assign (idx_vector::colon,
idx_vector (i),
x);
167 retval.assign (idx_vector::colon,
idx_vector (i+1, retval.cols ()),
172template <
typename T,
typename RV_T>
177 T retval (a.rows () + 1, a.cols ());
178 retval.assign (
idx_vector (0, i), idx_vector::colon,
180 retval.assign (
idx_vector (i), idx_vector::colon,
x);
181 retval.assign (
idx_vector (i+1, retval.rows ()), idx_vector::colon,
225 return a.index (idx_vector::colon,
idx_vector (p));
238 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
241 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
243 init (math::insert_col (m_q*m_r, j, u), get_type ());
260 dups = dups && js(i) == js(i+1);
263 (*current_liboctave_error_handler) (
"qrinsert: duplicate index detected");
265 if (u.numel () != m || u.cols () != nj)
268 if (nj > 0 && (js(0) < 0 || js(nj-1) > n))
269 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
275 a = math::insert_col (a, js(i), u.
column (i));
277 init (a, get_type ());
289 if (j < 0 || j > n-1)
290 (*current_liboctave_error_handler) (
"qrdelete: index out of range");
292 init (math::delete_col (m_q*m_r, j), get_type ());
308 dups = dups && js(i) == js(i+1);
311 (*current_liboctave_error_handler) (
"qrinsert: duplicate index detected");
313 if (nj > 0 && (js(0) > n-1 || js(nj-1) < 0))
320 a = math::delete_col (a, js(i));
322 init (a, get_type ());
335 if (! m_q.issquare () || u.numel () != n)
336 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
339 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
341 init (math::insert_row (m_q*m_r, j, u), get_type ());
352 if (! m_q.issquare ())
353 (*current_liboctave_error_handler) (
"qrdelete: dimensions mismatch");
355 if (j < 0 || j > m-1)
356 (*current_liboctave_error_handler) (
"qrdelete: index out of range");
358 init (math::delete_row (m_q*m_r, j), get_type ());
369 if (i < 0 || i > n-1 || j < 0 || j > n-1)
370 (*current_liboctave_error_handler) (
"qrshift: index out of range");
372 init (math::shift_cols (m_q*m_r, i, j), get_type ());
384 F77_INT n = to_f77_int (n_arg);
386 F77_INT min_mn = std::min (m, n);
391 for (
F77_INT j = 0; j < min_mn; j++)
393 F77_INT limit = (j < min_mn - 1 ? j : min_mn - 1);
394 for (
F77_INT i = limit + 1; i < m; i++)
395 afact.
elem (i, j) *= tau[j];
409 for (
F77_INT j = 0; j < n; j++)
413 m_r.xelem (i, j) = afact.
xelem (i, j);
415 m_r.xelem (i, j) = 0;
423 for (
F77_INT j = 0; j < m; j++)
424 for (
F77_INT i = j + 1; i < m; i++)
426 m_q.xelem (i, j) = afact.
xelem (i, j);
427 afact.
xelem (i, j) = 0;
434 F77_INT k = to_f77_int (m_q.cols ());
437 F77_XFCN (dorgqr, DORGQR, (m, k, min_mn, m_q.rwdata (), m,
438 tau, &rlwork, -1, info));
442 lwork = std::max (lwork,
static_cast<F77_INT> (1));
444 F77_XFCN (dorgqr, DORGQR, (m, k, min_mn, m_q.rwdata (), m,
445 tau, work, lwork, info));
457 F77_INT min_mn = (m < n ? m : n);
475 lwork = std::max (lwork,
static_cast<F77_INT> (1));
481 form (n, afact, tau, qr_type);
484#if defined (HAVE_QRUPDATE)
490 F77_INT m = to_f77_int (m_q.rows ());
491 F77_INT n = to_f77_int (m_r.cols ());
492 F77_INT k = to_f77_int (m_q.cols ());
497 if (u_nel != m || v_nel != n)
498 (*current_liboctave_error_handler) (
"qrupdate: dimensions mismatch");
503 F77_XFCN (dqr1up, DQR1UP, (m, n, k, m_q.rwdata (), m,
504 m_r.rwdata (), k, utmp.rwdata (),
512 F77_INT m = to_f77_int (m_q.rows ());
513 F77_INT n = to_f77_int (m_r.cols ());
514 F77_INT k = to_f77_int (m_q.cols ());
522 if (u_rows != m || v_rows != n || u_cols != v_cols)
523 (*current_liboctave_error_handler) (
"qrupdate: dimensions mismatch");
526 for (
F77_INT i = 0; i < u_cols; i++)
530 F77_XFCN (dqr1up, DQR1UP, (m, n, k, m_q.rwdata (), m,
531 m_r.rwdata (), k, utmp.
rwdata (),
540 F77_INT j = to_f77_int (j_arg);
542 F77_INT m = to_f77_int (m_q.rows ());
543 F77_INT n = to_f77_int (m_r.cols ());
544 F77_INT k = to_f77_int (m_q.cols ());
549 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
552 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
557 m_r.resize (k+1, n+1);
562 F77_INT ldq = to_f77_int (m_q.rows ());
563 F77_INT ldr = to_f77_int (m_r.rows ());
567 F77_XFCN (dqrinc, DQRINC, (m, n, k, m_q.rwdata (), ldq,
568 m_r.rwdata (), ldr, j + 1,
576 F77_INT m = to_f77_int (m_q.rows ());
577 F77_INT n = to_f77_int (m_r.cols ());
578 F77_INT k = to_f77_int (m_q.cols ());
584 for (
F77_INT i = 0; i < nj - 1; i++)
585 dups = dups && js(i) == js(i+1);
588 (*current_liboctave_error_handler) (
"qrinsert: duplicate index detected");
593 if (u_nel != m || u_cols != nj)
594 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
596 F77_INT js_beg = to_f77_int (js(0));
597 F77_INT js_end = to_f77_int (js(nj-1));
599 if (nj > 0 && (js_beg < 0 || js_end > n))
600 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
604 F77_INT kmax = std::min (k + nj, m);
607 m_q.resize (m, kmax);
608 m_r.resize (kmax, n + nj);
611 m_r.resize (k, n + nj);
613 F77_INT ldq = to_f77_int (m_q.rows ());
614 F77_INT ldr = to_f77_int (m_r.rows ());
617 for (
F77_INT i = 0; i < nj; i++)
621 F77_INT js_elt = to_f77_int (js(ii));
622 F77_XFCN (dqrinc, DQRINC, (m, n + ii, std::min (kmax, k + ii),
624 m_r.rwdata (), ldr, js_elt + 1,
634 F77_INT j = to_f77_int (j_arg);
636 F77_INT m = to_f77_int (m_q.rows ());
637 F77_INT k = to_f77_int (m_r.rows ());
638 F77_INT n = to_f77_int (m_r.cols ());
640 if (j < 0 || j > n-1)
641 (*current_liboctave_error_handler) (
"qrdelete: index out of range");
643 F77_INT ldq = to_f77_int (m_q.rows ());
644 F77_INT ldr = to_f77_int (m_r.rows ());
647 F77_XFCN (dqrdec, DQRDEC, (m, n, k, m_q.rwdata (), ldq,
648 m_r.rwdata (), ldr, j + 1, w));
653 m_r.resize (k-1, n-1);
663 F77_INT m = to_f77_int (m_q.rows ());
664 F77_INT n = to_f77_int (m_r.cols ());
665 F77_INT k = to_f77_int (m_q.cols ());
671 for (
F77_INT i = 0; i < nj - 1; i++)
672 dups = dups && js(i) == js(i+1);
675 (*current_liboctave_error_handler) (
"qrinsert: duplicate index detected");
677 F77_INT js_beg = to_f77_int (js(0));
678 F77_INT js_end = to_f77_int (js(nj-1));
680 if (nj > 0 && (js_beg > n-1 || js_end < 0))
681 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
685 F77_INT ldq = to_f77_int (m_q.rows ());
686 F77_INT ldr = to_f77_int (m_r.rows ());
689 for (
F77_INT i = 0; i < nj; i++)
692 F77_INT js_elt = to_f77_int (js(ii));
693 F77_XFCN (dqrdec, DQRDEC, (m, n - ii, (k == m ? k : k - ii),
701 m_q.resize (m, k - nj);
702 m_r.resize (k - nj, n - nj);
705 m_r.resize (k, n - nj);
713 F77_INT j = to_f77_int (j_arg);
715 F77_INT m = to_f77_int (m_r.rows ());
716 F77_INT n = to_f77_int (m_r.cols ());
721 if (! m_q.issquare () || u_nel != n)
722 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
725 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
727 m_q.resize (m + 1, m + 1);
728 m_r.resize (m + 1, n);
730 F77_INT ldq = to_f77_int (m_q.rows ());
731 F77_INT ldr = to_f77_int (m_r.rows ());
735 F77_XFCN (dqrinr, DQRINR, (m, n, m_q.rwdata (), ldq,
737 j + 1, utmp.
rwdata (), w));
745 F77_INT j = to_f77_int (j_arg);
747 F77_INT m = to_f77_int (m_r.rows ());
748 F77_INT n = to_f77_int (m_r.cols ());
750 if (! m_q.issquare ())
751 (*current_liboctave_error_handler) (
"qrdelete: dimensions mismatch");
753 if (j < 0 || j > m-1)
754 (*current_liboctave_error_handler) (
"qrdelete: index out of range");
756 F77_INT ldq = to_f77_int (m_q.rows ());
757 F77_INT ldr = to_f77_int (m_r.rows ());
760 F77_XFCN (dqrder, DQRDER, (m, n, m_q.rwdata (), ldq,
761 m_r.rwdata (), ldr, j + 1, w));
763 m_q.resize (m - 1, m - 1);
764 m_r.resize (m - 1, n);
771 F77_INT i = to_f77_int (i_arg);
772 F77_INT j = to_f77_int (j_arg);
774 F77_INT m = to_f77_int (m_q.rows ());
775 F77_INT k = to_f77_int (m_r.rows ());
776 F77_INT n = to_f77_int (m_r.cols ());
778 if (i < 0 || i > n-1 || j < 0 || j > n-1)
779 (*current_liboctave_error_handler) (
"qrshift: index out of range");
781 F77_INT ldq = to_f77_int (m_q.rows ());
782 F77_INT ldr = to_f77_int (m_r.rows ());
796 float *tau,
type qr_type)
798 F77_INT n = to_f77_int (n_arg);
800 F77_INT min_mn = std::min (m, n);
805 for (
F77_INT j = 0; j < min_mn; j++)
807 F77_INT limit = (j < min_mn - 1 ? j : min_mn - 1);
808 for (
F77_INT i = limit + 1; i < m; i++)
809 afact.
elem (i, j) *= tau[j];
823 for (
F77_INT j = 0; j < n; j++)
827 m_r.xelem (i, j) = afact.
xelem (i, j);
829 m_r.xelem (i, j) = 0;
837 for (
F77_INT j = 0; j < m; j++)
838 for (
F77_INT i = j + 1; i < m; i++)
840 m_q.xelem (i, j) = afact.
xelem (i, j);
841 afact.
xelem (i, j) = 0;
848 F77_INT k = to_f77_int (m_q.cols ());
851 F77_XFCN (sorgqr, SORGQR, (m, k, min_mn, m_q.rwdata (), m,
852 tau, &rlwork, -1, info));
856 lwork = std::max (lwork,
static_cast<F77_INT> (1));
858 F77_XFCN (sorgqr, SORGQR, (m, k, min_mn, m_q.rwdata (), m,
859 tau, work, lwork, info));
871 F77_INT min_mn = (m < n ? m : n);
889 lwork = std::max (lwork,
static_cast<F77_INT> (1));
895 form (n, afact, tau, qr_type);
898#if defined (HAVE_QRUPDATE)
904 F77_INT m = to_f77_int (m_q.rows ());
905 F77_INT n = to_f77_int (m_r.cols ());
906 F77_INT k = to_f77_int (m_q.cols ());
911 if (u_nel != m || v_nel != n)
912 (*current_liboctave_error_handler) (
"qrupdate: dimensions mismatch");
917 F77_XFCN (sqr1up, SQR1UP, (m, n, k, m_q.rwdata (), m,
918 m_r.rwdata (), k, utmp.rwdata (),
926 F77_INT m = to_f77_int (m_q.rows ());
927 F77_INT n = to_f77_int (m_r.cols ());
928 F77_INT k = to_f77_int (m_q.cols ());
936 if (u_rows != m || v_rows != n || u_cols != v_cols)
937 (*current_liboctave_error_handler) (
"qrupdate: dimensions mismatch");
940 for (
F77_INT i = 0; i < u_cols; i++)
944 F77_XFCN (sqr1up, SQR1UP, (m, n, k, m_q.rwdata (), m,
945 m_r.rwdata (), k, utmp.
rwdata (),
955 F77_INT j = to_f77_int (j_arg);
957 F77_INT m = to_f77_int (m_q.rows ());
958 F77_INT n = to_f77_int (m_r.cols ());
959 F77_INT k = to_f77_int (m_q.cols ());
964 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
967 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
972 m_r.resize (k+1, n+1);
977 F77_INT ldq = to_f77_int (m_q.rows ());
978 F77_INT ldr = to_f77_int (m_r.rows ());
982 F77_XFCN (sqrinc, SQRINC, (m, n, k, m_q.rwdata (), ldq,
983 m_r.rwdata (), ldr, j + 1,
992 F77_INT m = to_f77_int (m_q.rows ());
993 F77_INT n = to_f77_int (m_r.cols ());
994 F77_INT k = to_f77_int (m_q.cols ());
1000 for (
F77_INT i = 0; i < nj - 1; i++)
1001 dups = dups && js(i) == js(i+1);
1004 (*current_liboctave_error_handler) (
"qrinsert: duplicate index detected");
1009 if (u_nel != m || u_cols != nj)
1010 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
1012 F77_INT js_beg = to_f77_int (js(0));
1013 F77_INT js_end = to_f77_int (js(nj-1));
1015 if (nj > 0 && (js_beg < 0 || js_end > n))
1016 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
1020 F77_INT kmax = std::min (k + nj, m);
1023 m_q.resize (m, kmax);
1024 m_r.resize (kmax, n + nj);
1027 m_r.resize (k, n + nj);
1029 F77_INT ldq = to_f77_int (m_q.rows ());
1030 F77_INT ldr = to_f77_int (m_r.rows ());
1033 for (
F77_INT i = 0; i < nj; i++)
1037 F77_INT js_elt = to_f77_int (js(ii));
1038 F77_XFCN (sqrinc, SQRINC, (m, n + ii, std::min (kmax, k + ii),
1040 m_r.rwdata (), ldr, js_elt + 1,
1050 F77_INT j = to_f77_int (j_arg);
1052 F77_INT m = to_f77_int (m_q.rows ());
1053 F77_INT k = to_f77_int (m_r.rows ());
1054 F77_INT n = to_f77_int (m_r.cols ());
1056 if (j < 0 || j > n-1)
1057 (*current_liboctave_error_handler) (
"qrdelete: index out of range");
1059 F77_INT ldq = to_f77_int (m_q.rows ());
1060 F77_INT ldr = to_f77_int (m_r.rows ());
1063 F77_XFCN (sqrdec, SQRDEC, (m, n, k, m_q.rwdata (), ldq,
1064 m_r.rwdata (), ldr, j + 1, w));
1068 m_q.resize (m, k-1);
1069 m_r.resize (k-1, n-1);
1072 m_r.resize (k, n-1);
1079 F77_INT m = to_f77_int (m_q.rows ());
1080 F77_INT n = to_f77_int (m_r.cols ());
1081 F77_INT k = to_f77_int (m_q.cols ());
1087 for (
F77_INT i = 0; i < nj - 1; i++)
1088 dups = dups && js(i) == js(i+1);
1091 (*current_liboctave_error_handler) (
"qrinsert: duplicate index detected");
1093 F77_INT js_beg = to_f77_int (js(0));
1094 F77_INT js_end = to_f77_int (js(nj-1));
1096 if (nj > 0 && (js_beg > n-1 || js_end < 0))
1097 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
1101 F77_INT ldq = to_f77_int (m_q.rows ());
1102 F77_INT ldr = to_f77_int (m_r.rows ());
1105 for (
F77_INT i = 0; i < nj; i++)
1108 F77_INT js_elt = to_f77_int (js(ii));
1109 F77_XFCN (sqrdec, SQRDEC, (m, n - ii, (k == m ? k : k - ii),
1117 m_q.resize (m, k - nj);
1118 m_r.resize (k - nj, n - nj);
1121 m_r.resize (k, n - nj);
1130 F77_INT j = to_f77_int (j_arg);
1132 F77_INT m = to_f77_int (m_r.rows ());
1133 F77_INT n = to_f77_int (m_r.cols ());
1138 if (! m_q.issquare () || u_nel != n)
1139 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
1142 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
1144 m_q.resize (m + 1, m + 1);
1145 m_r.resize (m + 1, n);
1147 F77_INT ldq = to_f77_int (m_q.rows ());
1148 F77_INT ldr = to_f77_int (m_r.rows ());
1152 F77_XFCN (sqrinr, SQRINR, (m, n, m_q.rwdata (), ldq,
1154 j + 1, utmp.
rwdata (), w));
1162 F77_INT j = to_f77_int (j_arg);
1164 F77_INT m = to_f77_int (m_r.rows ());
1165 F77_INT n = to_f77_int (m_r.cols ());
1167 if (! m_q.issquare ())
1168 (*current_liboctave_error_handler) (
"qrdelete: dimensions mismatch");
1170 if (j < 0 || j > m-1)
1171 (*current_liboctave_error_handler) (
"qrdelete: index out of range");
1173 F77_INT ldq = to_f77_int (m_q.rows ());
1174 F77_INT ldr = to_f77_int (m_r.rows ());
1177 F77_XFCN (sqrder, SQRDER, (m, n, m_q.rwdata (), ldq,
1178 m_r.rwdata (), ldr, j + 1,
1181 m_q.resize (m - 1, m - 1);
1182 m_r.resize (m - 1, n);
1189 F77_INT i = to_f77_int (i_arg);
1190 F77_INT j = to_f77_int (j_arg);
1192 F77_INT m = to_f77_int (m_q.rows ());
1193 F77_INT k = to_f77_int (m_r.rows ());
1194 F77_INT n = to_f77_int (m_r.cols ());
1196 if (i < 0 || i > n-1 || j < 0 || j > n-1)
1197 (*current_liboctave_error_handler) (
"qrshift: index out of range");
1199 F77_INT ldq = to_f77_int (m_q.rows ());
1200 F77_INT ldr = to_f77_int (m_r.rows ());
1203 F77_XFCN (sqrshc, SQRSHC, (m, n, k,
1216 F77_INT n = to_f77_int (n_arg);
1218 F77_INT min_mn = std::min (m, n);
1223 for (
F77_INT j = 0; j < min_mn; j++)
1225 F77_INT limit = (j < min_mn - 1 ? j : min_mn - 1);
1226 for (
F77_INT i = limit + 1; i < m; i++)
1227 afact.
elem (i, j) *= tau[j];
1241 for (
F77_INT j = 0; j < n; j++)
1245 m_r.xelem (i, j) = afact.
xelem (i, j);
1247 m_r.xelem (i, j) = 0;
1255 for (
F77_INT j = 0; j < m; j++)
1256 for (
F77_INT i = j + 1; i < m; i++)
1258 m_q.xelem (i, j) = afact.
xelem (i, j);
1259 afact.
xelem (i, j) = 0;
1266 F77_INT k = to_f77_int (m_q.cols ());
1269 F77_XFCN (zungqr, ZUNGQR, (m, k, min_mn,
1277 lwork = std::max (lwork,
static_cast<F77_INT> (1));
1279 F77_XFCN (zungqr, ZUNGQR, (m, k, min_mn,
1295 F77_INT min_mn = (m < n ? m : n);
1315 lwork = std::max (lwork,
static_cast<F77_INT> (1));
1323 form (n, afact, tau, qr_type);
1326#if defined (HAVE_QRUPDATE)
1333 F77_INT m = to_f77_int (m_q.rows ());
1334 F77_INT n = to_f77_int (m_r.cols ());
1335 F77_INT k = to_f77_int (m_q.cols ());
1340 if (u_nel != m || v_nel != n)
1341 (*current_liboctave_error_handler) (
"qrupdate: dimensions mismatch");
1358 F77_INT m = to_f77_int (m_q.rows ());
1359 F77_INT n = to_f77_int (m_r.cols ());
1360 F77_INT k = to_f77_int (m_q.cols ());
1368 if (u_rows != m || v_rows != n || u_cols != v_cols)
1369 (*current_liboctave_error_handler) (
"qrupdate: dimensions mismatch");
1373 for (
F77_INT i = 0; i < u_cols; i++)
1377 F77_XFCN (zqr1up, ZQR1UP, (m, n, k,
1391 F77_INT j = to_f77_int (j_arg);
1393 F77_INT m = to_f77_int (m_q.rows ());
1394 F77_INT n = to_f77_int (m_r.cols ());
1395 F77_INT k = to_f77_int (m_q.cols ());
1400 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
1403 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
1407 m_q.resize (m, k+1);
1408 m_r.resize (k+1, n+1);
1411 m_r.resize (k, n+1);
1413 F77_INT ldq = to_f77_int (m_q.rows ());
1414 F77_INT ldr = to_f77_int (m_r.rows ());
1429 F77_INT m = to_f77_int (m_q.rows ());
1430 F77_INT n = to_f77_int (m_r.cols ());
1431 F77_INT k = to_f77_int (m_q.cols ());
1437 for (
F77_INT i = 0; i < nj - 1; i++)
1438 dups = dups && js(i) == js(i+1);
1441 (*current_liboctave_error_handler) (
"qrinsert: duplicate index detected");
1446 if (u_nel != m || u_cols != nj)
1447 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
1449 F77_INT js_beg = to_f77_int (js(0));
1450 F77_INT js_end = to_f77_int (js(nj-1));
1452 if (nj > 0 && (js_beg < 0 || js_end > n))
1453 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
1457 F77_INT kmax = std::min (k + nj, m);
1460 m_q.resize (m, kmax);
1461 m_r.resize (kmax, n + nj);
1464 m_r.resize (k, n + nj);
1466 F77_INT ldq = to_f77_int (m_q.rows ());
1467 F77_INT ldr = to_f77_int (m_r.rows ());
1470 for (
F77_INT i = 0; i < nj; i++)
1474 F77_INT js_elt = to_f77_int (js(ii));
1475 F77_XFCN (zqrinc, ZQRINC, (m, n + ii, std::min (kmax, k + ii),
1490 F77_INT j = to_f77_int (j_arg);
1492 F77_INT m = to_f77_int (m_q.rows ());
1493 F77_INT k = to_f77_int (m_r.rows ());
1494 F77_INT n = to_f77_int (m_r.cols ());
1496 if (j < 0 || j > n-1)
1497 (*current_liboctave_error_handler) (
"qrdelete: index out of range");
1499 F77_INT ldq = to_f77_int (m_q.rows ());
1500 F77_INT ldr = to_f77_int (m_r.rows ());
1509 m_q.resize (m, k-1);
1510 m_r.resize (k-1, n-1);
1513 m_r.resize (k, n-1);
1520 F77_INT m = to_f77_int (m_q.rows ());
1521 F77_INT n = to_f77_int (m_r.cols ());
1522 F77_INT k = to_f77_int (m_q.cols ());
1528 for (
F77_INT i = 0; i < nj - 1; i++)
1529 dups = dups && js(i) == js(i+1);
1532 (*current_liboctave_error_handler) (
"qrinsert: duplicate index detected");
1534 F77_INT js_beg = to_f77_int (js(0));
1535 F77_INT js_end = to_f77_int (js(nj-1));
1537 if (nj > 0 && (js_beg > n-1 || js_end < 0))
1538 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
1542 F77_INT ldq = to_f77_int (m_q.rows ());
1543 F77_INT ldr = to_f77_int (m_r.rows ());
1546 for (
F77_INT i = 0; i < nj; i++)
1549 F77_INT js_elt = to_f77_int (js(ii));
1550 F77_XFCN (zqrdec, ZQRDEC, (m, n - ii, (k == m ? k : k - ii),
1554 ldr, js_elt + 1, rw));
1559 m_q.resize (m, k - nj);
1560 m_r.resize (k - nj, n - nj);
1563 m_r.resize (k, n - nj);
1572 F77_INT j = to_f77_int (j_arg);
1574 F77_INT m = to_f77_int (m_r.rows ());
1575 F77_INT n = to_f77_int (m_r.cols ());
1580 if (! m_q.issquare () || u_nel != n)
1581 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
1584 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
1586 m_q.resize (m + 1, m + 1);
1587 m_r.resize (m + 1, n);
1589 F77_INT ldq = to_f77_int (m_q.rows ());
1590 F77_INT ldr = to_f77_int (m_r.rows ());
1605 F77_INT j = to_f77_int (j_arg);
1607 F77_INT m = to_f77_int (m_r.rows ());
1608 F77_INT n = to_f77_int (m_r.cols ());
1610 if (! m_q.issquare ())
1611 (*current_liboctave_error_handler) (
"qrdelete: dimensions mismatch");
1613 if (j < 0 || j > m-1)
1614 (*current_liboctave_error_handler) (
"qrdelete: index out of range");
1616 F77_INT ldq = to_f77_int (m_q.rows ());
1617 F77_INT ldr = to_f77_int (m_r.rows ());
1625 m_q.resize (m - 1, m - 1);
1626 m_r.resize (m - 1, n);
1634 F77_INT i = to_f77_int (i_arg);
1635 F77_INT j = to_f77_int (j_arg);
1637 F77_INT m = to_f77_int (m_q.rows ());
1638 F77_INT k = to_f77_int (m_r.rows ());
1639 F77_INT n = to_f77_int (m_r.cols ());
1641 if (i < 0 || i > n-1 || j < 0 || j > n-1)
1642 (*current_liboctave_error_handler) (
"qrshift: index out of range");
1644 F77_INT ldq = to_f77_int (m_q.rows ());
1645 F77_INT ldr = to_f77_int (m_r.rows ());
1649 F77_XFCN (zqrshc, ZQRSHC, (m, n, k,
1662 F77_INT n = to_f77_int (n_arg);
1664 F77_INT min_mn = std::min (m, n);
1669 for (
F77_INT j = 0; j < min_mn; j++)
1671 F77_INT limit = (j < min_mn - 1 ? j : min_mn - 1);
1672 for (
F77_INT i = limit + 1; i < m; i++)
1673 afact.
elem (i, j) *= tau[j];
1687 for (
F77_INT j = 0; j < n; j++)
1691 m_r.xelem (i, j) = afact.
xelem (i, j);
1693 m_r.xelem (i, j) = 0;
1701 for (
F77_INT j = 0; j < m; j++)
1702 for (
F77_INT i = j + 1; i < m; i++)
1704 m_q.xelem (i, j) = afact.
xelem (i, j);
1705 afact.
xelem (i, j) = 0;
1712 F77_INT k = to_f77_int (m_q.cols ());
1715 F77_XFCN (cungqr, CUNGQR, (m, k, min_mn,
1722 lwork = std::max (lwork,
static_cast<F77_INT> (1));
1724 F77_XFCN (cungqr, CUNGQR, (m, k, min_mn,
1739 F77_INT min_mn = (m < n ? m : n);
1758 lwork = std::max (lwork,
static_cast<F77_INT> (1));
1765 form (n, afact, tau, qr_type);
1768#if defined (HAVE_QRUPDATE)
1775 F77_INT m = to_f77_int (m_q.rows ());
1776 F77_INT n = to_f77_int (m_r.cols ());
1777 F77_INT k = to_f77_int (m_q.cols ());
1782 if (u_nel != m || v_nel != n)
1783 (*current_liboctave_error_handler) (
"qrupdate: dimensions mismatch");
1801 F77_INT m = to_f77_int (m_q.rows ());
1802 F77_INT n = to_f77_int (m_r.cols ());
1803 F77_INT k = to_f77_int (m_q.cols ());
1811 if (u_rows != m || v_rows != n || u_cols != v_cols)
1812 (*current_liboctave_error_handler) (
"qrupdate: dimensions mismatch");
1816 for (
F77_INT i = 0; i < u_cols; i++)
1833 F77_INT j = to_f77_int (j_arg);
1835 F77_INT m = to_f77_int (m_q.rows ());
1836 F77_INT n = to_f77_int (m_r.cols ());
1837 F77_INT k = to_f77_int (m_q.cols ());
1842 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
1845 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
1849 m_q.resize (m, k+1);
1850 m_r.resize (k+1, n+1);
1853 m_r.resize (k, n+1);
1855 F77_INT ldq = to_f77_int (m_q.rows ());
1856 F77_INT ldr = to_f77_int (m_r.rows ());
1870 F77_INT m = to_f77_int (m_q.rows ());
1871 F77_INT n = to_f77_int (m_r.cols ());
1872 F77_INT k = to_f77_int (m_q.cols ());
1878 for (
F77_INT i = 0; i < nj - 1; i++)
1879 dups = dups && js(i) == js(i+1);
1882 (*current_liboctave_error_handler) (
"qrinsert: duplicate index detected");
1887 if (u_nel != m || u_cols != nj)
1888 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
1890 F77_INT js_beg = to_f77_int (js(0));
1891 F77_INT js_end = to_f77_int (js(nj-1));
1893 if (nj > 0 && (js_beg < 0 || js_end > n))
1894 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
1898 F77_INT kmax = std::min (k + nj, m);
1901 m_q.resize (m, kmax);
1902 m_r.resize (kmax, n + nj);
1905 m_r.resize (k, n + nj);
1907 F77_INT ldq = to_f77_int (m_q.rows ());
1908 F77_INT ldr = to_f77_int (m_r.rows ());
1911 for (
F77_INT i = 0; i < nj; i++)
1914 F77_INT js_elt = to_f77_int (js(ii));
1915 F77_XFCN (cqrinc, CQRINC, (m, n + ii, std::min (kmax, k + ii),
1929 F77_INT j = to_f77_int (j_arg);
1931 F77_INT m = to_f77_int (m_q.rows ());
1932 F77_INT k = to_f77_int (m_r.rows ());
1933 F77_INT n = to_f77_int (m_r.cols ());
1935 if (j < 0 || j > n-1)
1936 (*current_liboctave_error_handler) (
"qrdelete: index out of range");
1938 F77_INT ldq = to_f77_int (m_q.rows ());
1939 F77_INT ldr = to_f77_int (m_r.rows ());
1948 m_q.resize (m, k-1);
1949 m_r.resize (k-1, n-1);
1952 m_r.resize (k, n-1);
1959 F77_INT m = to_f77_int (m_q.rows ());
1960 F77_INT n = to_f77_int (m_r.cols ());
1961 F77_INT k = to_f77_int (m_q.cols ());
1967 for (
F77_INT i = 0; i < nj - 1; i++)
1968 dups = dups && js(i) == js(i+1);
1971 (*current_liboctave_error_handler) (
"qrinsert: duplicate index detected");
1973 F77_INT js_beg = to_f77_int (js(0));
1974 F77_INT js_end = to_f77_int (js(nj-1));
1976 if (nj > 0 && (js_beg > n-1 || js_end < 0))
1977 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
1981 F77_INT ldq = to_f77_int (m_q.rows ());
1982 F77_INT ldr = to_f77_int (m_r.rows ());
1985 for (
F77_INT i = 0; i < nj; i++)
1988 F77_INT js_elt = to_f77_int (js(ii));
1989 F77_XFCN (cqrdec, CQRDEC, (m, n - ii, (k == m ? k : k - ii),
1997 m_q.resize (m, k - nj);
1998 m_r.resize (k - nj, n - nj);
2001 m_r.resize (k, n - nj);
2010 F77_INT j = to_f77_int (j_arg);
2012 F77_INT m = to_f77_int (m_r.rows ());
2013 F77_INT n = to_f77_int (m_r.cols ());
2018 if (! m_q.issquare () || u_nel != n)
2019 (*current_liboctave_error_handler) (
"qrinsert: dimensions mismatch");
2022 (*current_liboctave_error_handler) (
"qrinsert: index out of range");
2024 m_q.resize (m + 1, m + 1);
2025 m_r.resize (m + 1, n);
2027 F77_INT ldq = to_f77_int (m_q.rows ());
2028 F77_INT ldr = to_f77_int (m_r.rows ());
2043 F77_INT j = to_f77_int (j_arg);
2045 F77_INT m = to_f77_int (m_r.rows ());
2046 F77_INT n = to_f77_int (m_r.cols ());
2048 if (! m_q.issquare ())
2049 (*current_liboctave_error_handler) (
"qrdelete: dimensions mismatch");
2051 if (j < 0 || j > m-1)
2052 (*current_liboctave_error_handler) (
"qrdelete: index out of range");
2054 F77_INT ldq = to_f77_int (m_q.rows ());
2055 F77_INT ldr = to_f77_int (m_r.rows ());
2063 m_q.resize (m - 1, m - 1);
2064 m_r.resize (m - 1, n);
2072 F77_INT i = to_f77_int (i_arg);
2073 F77_INT j = to_f77_int (j_arg);
2075 F77_INT m = to_f77_int (m_q.rows ());
2076 F77_INT k = to_f77_int (m_r.rows ());
2077 F77_INT n = to_f77_int (m_r.cols ());
2079 if (i < 0 || i > n-1 || j < 0 || j > n-1)
2080 (*current_liboctave_error_handler) (
"qrshift: index out of range");
2082 F77_INT ldq = to_f77_int (m_q.rows ());
2083 F77_INT ldr = to_f77_int (m_r.rows ());
2087 F77_XFCN (cqrshc, CQRSHC, (m, n, k,
2105OCTAVE_END_NAMESPACE(math)
2106OCTAVE_END_NAMESPACE(octave)
N Dimensional Array with copy-on-write semantics.
T & xelem(octave_idx_type n)
Size of the specified dimension.
T & elem(octave_idx_type n)
Size of the specified dimension.
Array< T, Alloc > column(octave_idx_type k) const
Extract column: A(:,k+1).
octave_idx_type rows() const
octave_idx_type cols() const
Array< T, Alloc > sort(int dim=0, sortmode mode=ASCENDING) const
Size of the specified dimension.
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.
void resize(octave_idx_type nr, octave_idx_type nc, const Complex &rfv=Complex(0))
ComplexColumnVector column(octave_idx_type i) const
FloatComplexColumnVector column(octave_idx_type i) const
void resize(octave_idx_type nr, octave_idx_type nc, const FloatComplex &rfv=FloatComplex(0))
void resize(octave_idx_type nr, octave_idx_type nc, float rfv=0)
FloatColumnVector column(octave_idx_type i) const
void resize(octave_idx_type nr, octave_idx_type nc, double rfv=0)
ColumnVector column(octave_idx_type i) const
Vector representing the dimensions (size) of an Array.
octave_idx_type index(const T *src, octave_idx_type n, T *dest) const
void insert_row(const RV_T &u, octave_idx_type j)
void delete_row(octave_idx_type j)
void delete_col(octave_idx_type j)
void update(const CV_T &u, const CV_T &v)
void form(octave_idx_type n, T &afact, ELT_T *tau, type qr_type)
void insert_col(const CV_T &u, octave_idx_type j)
void shift_cols(octave_idx_type i, octave_idx_type j)
void init(const T &a, type qr_type)
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
#define F77_CONST_CMPLX_ARG(x)
#define F77_DBLE_CMPLX_ARG(x)
#define F77_XFCN(f, F, args)
octave_f77_int_type F77_INT
#define F77_CONST_DBLE_CMPLX_ARG(x)
OCTAVE_NORETURN liboctave_error_handler current_liboctave_error_handler
std::complex< double > Complex
std::complex< float > FloatComplex
#define OCTAVE_LOCAL_BUFFER(T, buf, size)
void warn_qrupdate_once()
F77_RET_T const F77_DBLE * x