annotate liboctave/numeric/qr.cc @ 22322:93b3cdd36854

move most f77 function decls to separate header files * liboctave/numeric/lo-amos-proto.h, liboctave/numeric/lo-arpack-proto.h, liboctave/numeric/lo-blas-proto.h, liboctave/numeric/lo-fftpack-proto.h, liboctave/numeric/lo-lapack-proto.h, liboctave/numeric/lo-qrupdate-proto.h, liboctave/numeric/lo-ranlib-proto.h, liboctave/numeric/lo-slatec-proto.h: New files. * liboctave/numeric/module.mk: Update. * __pchip_deriv__.cc, dot.cc, interpreter.cc, ordschur.cc, qz.cc, CColVector.cc, CMatrix.cc, CNDArray.cc, CRowVector.cc, CSparse.cc, dColVector.cc, dMatrix.cc, dNDArray.cc, dRowVector.cc, dSparse.cc, fCColVector.cc, fCMatrix.cc, fCNDArray.cc, fCRowVector.cc, fColVector.cc, fMatrix.cc, fNDArray.cc, fRowVector.cc, EIG.cc, aepbalance.cc, chol.cc, eigs-base.cc, fEIG.cc, gepbalance.cc, gsvd.cc, hess.cc, lo-specfun.cc, lu.cc, oct-rand.cc, qr.cc, qrp.cc, randpoisson.cc, schur.cc, sparse-qr.cc, svd.cc: Use new header files.
author John W. Eaton <jwe@octave.org>
date Wed, 17 Aug 2016 00:18:08 -0400
parents 6ca3acf5fad8
children bac0d6f07a3e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9713
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
1 /*
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
2
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
3 Copyright (C) 1994-2015 John W. Eaton
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
4 Copyright (C) 2008-2009 Jaroslav Hajek
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
5 Copyright (C) 2009 VZLU Prague
9713
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
6
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
7 This file is part of Octave.
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
8
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
9 Octave is free software; you can redistribute it and/or modify it
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
10 under the terms of the GNU General Public License as published by the
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
11 Free Software Foundation; either version 3 of the License, or (at your
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
12 option) any later version.
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
13
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
14 Octave is distributed in the hope that it will be useful, but WITHOUT
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
17 for more details.
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
18
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
19 You should have received a copy of the GNU General Public License
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
20 along with Octave; see the file COPYING. If not, see
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
21 <http://www.gnu.org/licenses/>.
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
22
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
23 */
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
24
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21301
diff changeset
25 #if defined (HAVE_CONFIG_H)
21301
40de9f8f23a6 Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents: 21285
diff changeset
26 # include "config.h"
9713
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
27 #endif
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
28
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
29 #include "CColVector.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
30 #include "CMatrix.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
31 #include "CRowVector.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
32 #include "dColVector.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
33 #include "dMatrix.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
34 #include "dRowVector.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
35 #include "f77-fcn.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
36 #include "fCColVector.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
37 #include "fCMatrix.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
38 #include "fCRowVector.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
39 #include "fColVector.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
40 #include "fMatrix.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
41 #include "fRowVector.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
42 #include "idx-vector.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
43 #include "lo-error.h"
22322
93b3cdd36854 move most f77 function decls to separate header files
John W. Eaton <jwe@octave.org>
parents: 22317
diff changeset
44 #include "lo-lapack-proto.h"
93b3cdd36854 move most f77 function decls to separate header files
John W. Eaton <jwe@octave.org>
parents: 22317
diff changeset
45 #include "lo-qrupdate-proto.h"
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
46 #include "oct-locbuf.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
47 #include "qr.h"
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
48
22317
6ca3acf5fad8 move some new numeric classes to namespace octave::math
John W. Eaton <jwe@octave.org>
parents: 22135
diff changeset
49 namespace octave
6ca3acf5fad8 move some new numeric classes to namespace octave::math
John W. Eaton <jwe@octave.org>
parents: 22135
diff changeset
50 {
6ca3acf5fad8 move some new numeric classes to namespace octave::math
John W. Eaton <jwe@octave.org>
parents: 22135
diff changeset
51 namespace math
6ca3acf5fad8 move some new numeric classes to namespace octave::math
John W. Eaton <jwe@octave.org>
parents: 22135
diff changeset
52 {
6ca3acf5fad8 move some new numeric classes to namespace octave::math
John W. Eaton <jwe@octave.org>
parents: 22135
diff changeset
53
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
54 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
55 qr<T>::qr (const T& q_arg, const T& r_arg)
11505
9a308e96194e more data member initialization fixes
John W. Eaton <jwe@octave.org>
parents: 9715
diff changeset
56 : q (q_arg), r (r_arg)
9713
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
57 {
18084
8e056300994b Follow coding convention of defining and initializing only 1 variable per line in liboctave.
Rik <rik@octave.org>
parents: 17744
diff changeset
58 octave_idx_type q_nr = q.rows ();
8e056300994b Follow coding convention of defining and initializing only 1 variable per line in liboctave.
Rik <rik@octave.org>
parents: 17744
diff changeset
59 octave_idx_type q_nc = q.columns ();
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
60
18084
8e056300994b Follow coding convention of defining and initializing only 1 variable per line in liboctave.
Rik <rik@octave.org>
parents: 17744
diff changeset
61 octave_idx_type r_nr = r.rows ();
8e056300994b Follow coding convention of defining and initializing only 1 variable per line in liboctave.
Rik <rik@octave.org>
parents: 17744
diff changeset
62 octave_idx_type r_nc = r.columns ();
11505
9a308e96194e more data member initialization fixes
John W. Eaton <jwe@octave.org>
parents: 9715
diff changeset
63
9a308e96194e more data member initialization fixes
John W. Eaton <jwe@octave.org>
parents: 9715
diff changeset
64 if (! (q_nc == r_nr && (q_nr == q_nc || (q_nr > q_nc && r_nr == r_nc))))
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
65 (*current_liboctave_error_handler) ("QR dimensions mismatch");
9713
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
66 }
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
67
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
68 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
69 typename qr<T>::type
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
70 qr<T>::get_type (void) const
9713
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
71 {
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
72 type retval;
11505
9a308e96194e more data member initialization fixes
John W. Eaton <jwe@octave.org>
parents: 9715
diff changeset
73
20955
77f5591878bf maint: Use '! expr' rather than '!expr' to conform to coding guidelines.
Rik <rik@octave.org>
parents: 19697
diff changeset
74 if (! q.is_empty () && q.is_square ())
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
75 retval = qr<T>::std;
9713
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
76 else if (q.rows () > q.columns () && r.is_square ())
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
77 retval = qr<T>::economy;
9713
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
78 else
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
79 retval = qr<T>::raw;
11505
9a308e96194e more data member initialization fixes
John W. Eaton <jwe@octave.org>
parents: 9715
diff changeset
80
9713
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
81 return retval;
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
82 }
7918eb15040c refactor the QR classes onto a templated base
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
83
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
84 template <typename T>
9715
9f27172fbd1e auto-set MatrixType from certain functions
Jaroslav Hajek <highegg@gmail.com>
parents: 9713
diff changeset
85 bool
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
86 qr<T>::regular (void) const
9715
9f27172fbd1e auto-set MatrixType from certain functions
Jaroslav Hajek <highegg@gmail.com>
parents: 9713
diff changeset
87 {
13217
08ba694723f5 fix warnings for unused but set variables
John W. Eaton <jwe@octave.org>
parents: 11523
diff changeset
88 bool retval = true;
08ba694723f5 fix warnings for unused but set variables
John W. Eaton <jwe@octave.org>
parents: 11523
diff changeset
89
9715
9f27172fbd1e auto-set MatrixType from certain functions
Jaroslav Hajek <highegg@gmail.com>
parents: 9713
diff changeset
90 octave_idx_type k = std::min (r.rows (), r.columns ());
13217
08ba694723f5 fix warnings for unused but set variables
John W. Eaton <jwe@octave.org>
parents: 11523
diff changeset
91
9715
9f27172fbd1e auto-set MatrixType from certain functions
Jaroslav Hajek <highegg@gmail.com>
parents: 9713
diff changeset
92 for (octave_idx_type i = 0; i < k; i++)
13217
08ba694723f5 fix warnings for unused but set variables
John W. Eaton <jwe@octave.org>
parents: 11523
diff changeset
93 {
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
94 if (r(i, i) == ELT_T ())
13217
08ba694723f5 fix warnings for unused but set variables
John W. Eaton <jwe@octave.org>
parents: 11523
diff changeset
95 {
08ba694723f5 fix warnings for unused but set variables
John W. Eaton <jwe@octave.org>
parents: 11523
diff changeset
96 retval = false;
08ba694723f5 fix warnings for unused but set variables
John W. Eaton <jwe@octave.org>
parents: 11523
diff changeset
97 break;
08ba694723f5 fix warnings for unused but set variables
John W. Eaton <jwe@octave.org>
parents: 11523
diff changeset
98 }
08ba694723f5 fix warnings for unused but set variables
John W. Eaton <jwe@octave.org>
parents: 11523
diff changeset
99 }
9715
9f27172fbd1e auto-set MatrixType from certain functions
Jaroslav Hajek <highegg@gmail.com>
parents: 9713
diff changeset
100
13217
08ba694723f5 fix warnings for unused but set variables
John W. Eaton <jwe@octave.org>
parents: 11523
diff changeset
101 return retval;
9715
9f27172fbd1e auto-set MatrixType from certain functions
Jaroslav Hajek <highegg@gmail.com>
parents: 9713
diff changeset
102 }
9f27172fbd1e auto-set MatrixType from certain functions
Jaroslav Hajek <highegg@gmail.com>
parents: 9713
diff changeset
103
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
104 #if ! defined (HAVE_QRUPDATE)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
105
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
106 // Replacement update methods.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
107
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
108 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
109 warn_qrupdate_once (void)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
110 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
111 static bool warned = false;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
112
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
113 if (! warned)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
114 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
115 (*current_liboctave_warning_with_id_handler)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
116 ("Octave:missing-dependency",
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
117 "In this version of Octave, QR & Cholesky updating routines "
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
118 "simply update the matrix and recalculate factorizations. "
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
119 "To use fast algorithms, link Octave with the qrupdate library. "
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
120 "See <http://sourceforge.net/projects/qrupdate>.");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
121
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
122 warned = true;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
123 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
124 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
125
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
126 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
127 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
128 qr<T>::update (const CV_T& u, const CV_T& v)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
129 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
130 warn_qrupdate_once ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
131
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
132 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
133 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
134
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
135 if (u.numel () != m || v.numel () != n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
136 (*current_liboctave_error_handler) ("qrupdate: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
137
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
138 init (q*r + T (u) * T (v).hermitian (), get_type ());
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
139 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
140
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
141 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
142 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
143 qr<T>::update (const T& u, const T& v)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
144 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
145 warn_qrupdate_once ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
146
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
147 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
148 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
149
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
150 if (u.rows () != m || v.rows () != n || u.cols () != v.cols ())
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
151 (*current_liboctave_error_handler) ("qrupdate: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
152
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
153 init (q*r + u * v.hermitian (), get_type ());
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
154 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
155
21285
d3b265a83adc make building without qrupdate work again
John W. Eaton <jwe@octave.org>
parents: 21279
diff changeset
156 template <typename T, typename CV_T>
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
157 static
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
158 T
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
159 insert_col (const T& a, octave_idx_type i, const CV_T& x)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
160 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
161 T retval (a.rows (), a.columns () + 1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
162 retval.assign (idx_vector::colon, idx_vector (0, i),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
163 a.index (idx_vector::colon, idx_vector (0, i)));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
164 retval.assign (idx_vector::colon, idx_vector (i), x);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
165 retval.assign (idx_vector::colon, idx_vector (i+1, retval.columns ()),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
166 a.index (idx_vector::colon, idx_vector (i, a.columns ())));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
167 return retval;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
168 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
169
21285
d3b265a83adc make building without qrupdate work again
John W. Eaton <jwe@octave.org>
parents: 21279
diff changeset
170 template <typename T, typename RV_T>
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
171 static
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
172 T
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
173 insert_row (const T& a, octave_idx_type i, const RV_T& x)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
174 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
175 T retval (a.rows () + 1, a.columns ());
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
176 retval.assign (idx_vector (0, i), idx_vector::colon,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
177 a.index (idx_vector (0, i), idx_vector::colon));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
178 retval.assign (idx_vector (i), idx_vector::colon, x);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
179 retval.assign (idx_vector (i+1, retval.rows ()), idx_vector::colon,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
180 a.index (idx_vector (i, a.rows ()), idx_vector::colon));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
181 return retval;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
182 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
183
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
184 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
185 static
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
186 T
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
187 delete_col (const T& a, octave_idx_type i)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
188 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
189 T retval = a;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
190 retval.delete_elements (1, idx_vector (i));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
191 return retval;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
192 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
193
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
194 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
195 static
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
196 T
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
197 delete_row (const T& a, octave_idx_type i)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
198 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
199 T retval = a;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
200 retval.delete_elements (0, idx_vector (i));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
201 return retval;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
202 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
203
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
204 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
205 static
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
206 T
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
207 shift_cols (const T& a, octave_idx_type i, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
208 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
209 octave_idx_type n = a.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
210 Array<octave_idx_type> p (dim_vector (n, 1));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
211 for (octave_idx_type k = 0; k < n; k++) p(k) = k;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
212 if (i < j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
213 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
214 for (octave_idx_type k = i; k < j; k++) p(k) = k+1;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
215 p(j) = i;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
216 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
217 else if (j < i)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
218 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
219 p(j) = i;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
220 for (octave_idx_type k = j+1; k < i+1; k++) p(k) = k-1;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
221 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
222
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
223 return a.index (idx_vector::colon, idx_vector (p));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
224 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
225
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
226 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
227 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
228 qr<T>::insert_col (const CV_T& u, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
229 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
230 warn_qrupdate_once ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
231
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
232 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
233 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
234
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
235 if (u.numel () != m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
236 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
237 if (j < 0 || j > n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
238 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
239
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
240 init (::insert_col (q*r, j, u), get_type ());
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
241 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
242
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
243 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
244 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
245 qr<T>::insert_col (const T& u, const Array<octave_idx_type>& j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
246 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
247 warn_qrupdate_once ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
248
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
249 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
250 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
251
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
252 Array<octave_idx_type> jsi;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
253 Array<octave_idx_type> js = j.sort (jsi, 0, ASCENDING);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
254 octave_idx_type nj = js.numel ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
255 bool dups = false;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
256 for (octave_idx_type i = 0; i < nj - 1; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
257 dups = dups && js(i) == js(i+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
258
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
259 if (dups)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
260 (*current_liboctave_error_handler) ("qrinsert: duplicate index detected");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
261 if (u.numel () != m || u.columns () != nj)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
262 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
263 if (nj > 0 && (js(0) < 0 || js(nj-1) > n))
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
264 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
265
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
266 if (nj > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
267 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
268 T a = q*r;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
269 for (octave_idx_type i = 0; i < js.numel (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
270 a = ::insert_col (a, js(i), u.column (i));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
271 init (a, get_type ());
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
272 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
273 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
274
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
275 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
276 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
277 qr<T>::delete_col (octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
278 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
279 warn_qrupdate_once ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
280
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
281 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
282
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
283 if (j < 0 || j > n-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
284 (*current_liboctave_error_handler) ("qrdelete: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
285
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
286 init (::delete_col (q*r, j), get_type ());
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
287 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
288
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
289 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
290 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
291 qr<T>::delete_col (const Array<octave_idx_type>& j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
292 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
293 warn_qrupdate_once ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
294
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
295 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
296
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
297 Array<octave_idx_type> jsi;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
298 Array<octave_idx_type> js = j.sort (jsi, 0, DESCENDING);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
299 octave_idx_type nj = js.numel ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
300 bool dups = false;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
301 for (octave_idx_type i = 0; i < nj - 1; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
302 dups = dups && js(i) == js(i+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
303
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
304 if (dups)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
305 (*current_liboctave_error_handler) ("qrinsert: duplicate index detected");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
306 if (nj > 0 && (js(0) > n-1 || js(nj-1) < 0))
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
307 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
308
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
309 if (nj > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
310 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
311 T a = q*r;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
312 for (octave_idx_type i = 0; i < js.numel (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
313 a = ::delete_col (a, js(i));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
314 init (a, get_type ());
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
315 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
316 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
317
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
318 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
319 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
320 qr<T>::insert_row (const RV_T& u, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
321 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
322 warn_qrupdate_once ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
323
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
324 octave_idx_type m = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
325 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
326
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
327 if (! q.is_square () || u.numel () != n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
328 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
329 if (j < 0 || j > m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
330 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
331
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
332 init (::insert_row (q*r, j, u), get_type ());
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
333 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
334
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
335 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
336 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
337 qr<T>::delete_row (octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
338 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
339 warn_qrupdate_once ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
340
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
341 octave_idx_type m = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
342
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
343 if (! q.is_square ())
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
344 (*current_liboctave_error_handler) ("qrdelete: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
345 if (j < 0 || j > m-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
346 (*current_liboctave_error_handler) ("qrdelete: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
347
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
348 init (::delete_row (q*r, j), get_type ());
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
349 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
350
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
351 template <typename T>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
352 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
353 qr<T>::shift_cols (octave_idx_type i, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
354 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
355 warn_qrupdate_once ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
356
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
357 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
358
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
359 if (i < 0 || i > n-1 || j < 0 || j > n-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
360 (*current_liboctave_error_handler) ("qrshift: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
361
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
362 init (::shift_cols (q*r, i, j), get_type ());
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
363 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
364
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
365 #endif
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
366
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
367 // Specializations.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
368
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
369 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
370 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
371 qr<Matrix>::form (octave_idx_type n, Matrix& afact, double *tau, type qr_type)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
372 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
373 octave_idx_type m = afact.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
374 octave_idx_type min_mn = std::min (m, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
375 octave_idx_type info;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
376
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
377 if (qr_type == qr<Matrix>::raw)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
378 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
379 for (octave_idx_type j = 0; j < min_mn; j++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
380 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
381 octave_idx_type limit = j < min_mn - 1 ? j : min_mn - 1;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
382 for (octave_idx_type i = limit + 1; i < m; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
383 afact.elem (i, j) *= tau[j];
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
384 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
385
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
386 r = afact;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
387 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
388 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
389 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
390 // Attempt to minimize copying.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
391 if (m >= n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
392 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
393 // afact will become q.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
394 q = afact;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
395 octave_idx_type k = qr_type == qr<Matrix>::economy ? n : m;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
396 r = Matrix (k, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
397 for (octave_idx_type j = 0; j < n; j++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
398 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
399 octave_idx_type i = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
400 for (; i <= j; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
401 r.xelem (i, j) = afact.xelem (i, j);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
402 for (; i < k; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
403 r.xelem (i, j) = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
404 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
405 afact = Matrix (); // optimize memory
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
406 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
407 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
408 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
409 // afact will become r.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
410 q = Matrix (m, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
411 for (octave_idx_type j = 0; j < m; j++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
412 for (octave_idx_type i = j + 1; i < m; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
413 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
414 q.xelem (i, j) = afact.xelem (i, j);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
415 afact.xelem (i, j) = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
416 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
417 r = afact;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
418 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
419
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
420 if (m > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
421 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
422 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
423 // workspace query.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
424 double rlwork;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
425 F77_XFCN (dorgqr, DORGQR, (m, k, min_mn, q.fortran_vec (), m, tau,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
426 &rlwork, -1, info));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
427
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
428 // allocate buffer and do the job.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
429 octave_idx_type lwork = rlwork;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
430 lwork = std::max (lwork, static_cast<octave_idx_type> (1));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
431 OCTAVE_LOCAL_BUFFER (double, work, lwork);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
432 F77_XFCN (dorgqr, DORGQR, (m, k, min_mn, q.fortran_vec (), m, tau,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
433 work, lwork, info));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
434 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
435 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
436 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
437
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
438 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
439 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
440 qr<Matrix>::init (const Matrix& a, type qr_type)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
441 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
442 octave_idx_type m = a.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
443 octave_idx_type n = a.cols ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
444
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
445 octave_idx_type min_mn = m < n ? m : n;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
446 OCTAVE_LOCAL_BUFFER (double, tau, min_mn);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
447
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
448 octave_idx_type info = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
449
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
450 Matrix afact = a;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
451 if (m > n && qr_type == qr<Matrix>::std)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
452 afact.resize (m, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
453
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
454 if (m > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
455 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
456 // workspace query.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
457 double rlwork;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
458 F77_XFCN (dgeqrf, DGEQRF, (m, n, afact.fortran_vec (), m, tau,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
459 &rlwork, -1, info));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
460
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
461 // allocate buffer and do the job.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
462 octave_idx_type lwork = rlwork;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
463 lwork = std::max (lwork, static_cast<octave_idx_type> (1));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
464 OCTAVE_LOCAL_BUFFER (double, work, lwork);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
465 F77_XFCN (dgeqrf, DGEQRF, (m, n, afact.fortran_vec (), m, tau,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
466 work, lwork, info));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
467 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
468
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
469 form (n, afact, tau, qr_type);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
470 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
471
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
472 #if defined (HAVE_QRUPDATE)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
473
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
474 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
475 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
476 qr<Matrix>::update (const ColumnVector& u, const ColumnVector& v)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
477 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
478 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
479 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
480 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
481
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
482 if (u.numel () != m || v.numel () != n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
483 (*current_liboctave_error_handler) ("qrupdate: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
484
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
485 ColumnVector utmp = u;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
486 ColumnVector vtmp = v;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
487 OCTAVE_LOCAL_BUFFER (double, w, 2*k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
488 F77_XFCN (dqr1up, DQR1UP, (m, n, k, q.fortran_vec (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
489 m, r.fortran_vec (), k,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
490 utmp.fortran_vec (), vtmp.fortran_vec (), w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
491 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
492
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
493 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
494 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
495 qr<Matrix>::update (const Matrix& u, const Matrix& v)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
496 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
497 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
498 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
499 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
500
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
501 if (u.rows () != m || v.rows () != n || u.cols () != v.cols ())
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
502 (*current_liboctave_error_handler) ("qrupdate: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
503
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
504 OCTAVE_LOCAL_BUFFER (double, w, 2*k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
505 for (volatile octave_idx_type i = 0; i < u.cols (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
506 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
507 ColumnVector utmp = u.column (i);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
508 ColumnVector vtmp = v.column (i);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
509 F77_XFCN (dqr1up, DQR1UP, (m, n, k, q.fortran_vec (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
510 m, r.fortran_vec (), k,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
511 utmp.fortran_vec (), vtmp.fortran_vec (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
512 w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
513 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
514 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
515
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
516 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
517 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
518 qr<Matrix>::insert_col (const ColumnVector& u, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
519 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
520 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
521 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
522 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
523
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
524 if (u.numel () != m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
525 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
526 if (j < 0 || j > n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
527 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
528
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
529 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
530 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
531 q.resize (m, k+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
532 r.resize (k+1, n+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
533 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
534 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
535 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
536 r.resize (k, n+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
537 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
538
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
539 ColumnVector utmp = u;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
540 OCTAVE_LOCAL_BUFFER (double, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
541 F77_XFCN (dqrinc, DQRINC, (m, n, k, q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
542 r.fortran_vec (), r.rows (), j + 1,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
543 utmp.data (), w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
544 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
545
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
546 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
547 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
548 qr<Matrix>::insert_col (const Matrix& u, const Array<octave_idx_type>& j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
549 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
550 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
551 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
552 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
553
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
554 Array<octave_idx_type> jsi;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
555 Array<octave_idx_type> js = j.sort (jsi, 0, ASCENDING);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
556 octave_idx_type nj = js.numel ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
557 bool dups = false;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
558 for (octave_idx_type i = 0; i < nj - 1; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
559 dups = dups && js(i) == js(i+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
560
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
561 if (dups)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
562 (*current_liboctave_error_handler) ("qrinsert: duplicate index detected");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
563 if (u.numel () != m || u.columns () != nj)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
564 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
565 if (nj > 0 && (js(0) < 0 || js(nj-1) > n))
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
566 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
567
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
568 if (nj > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
569 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
570 octave_idx_type kmax = std::min (k + nj, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
571 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
572 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
573 q.resize (m, kmax);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
574 r.resize (kmax, n + nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
575 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
576 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
577 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
578 r.resize (k, n + nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
579 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
580
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
581 OCTAVE_LOCAL_BUFFER (double, w, kmax);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
582 for (volatile octave_idx_type i = 0; i < js.numel (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
583 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
584 octave_idx_type ii = i;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
585 ColumnVector utmp = u.column (jsi(i));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
586 F77_XFCN (dqrinc, DQRINC, (m, n + ii, std::min (kmax, k + ii),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
587 q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
588 r.fortran_vec (), r.rows (), js(ii) + 1,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
589 utmp.data (), w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
590 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
591 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
592 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
593
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
594 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
595 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
596 qr<Matrix>::delete_col (octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
597 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
598 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
599 octave_idx_type k = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
600 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
601
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
602 if (j < 0 || j > n-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
603 (*current_liboctave_error_handler) ("qrdelete: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
604
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
605 OCTAVE_LOCAL_BUFFER (double, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
606 F77_XFCN (dqrdec, DQRDEC, (m, n, k, q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
607 r.fortran_vec (), r.rows (), j + 1, w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
608
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
609 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
610 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
611 q.resize (m, k-1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
612 r.resize (k-1, n-1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
613 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
614 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
615 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
616 r.resize (k, n-1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
617 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
618 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
619
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
620 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
621 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
622 qr<Matrix>::delete_col (const Array<octave_idx_type>& j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
623 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
624 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
625 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
626 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
627
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
628 Array<octave_idx_type> jsi;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
629 Array<octave_idx_type> js = j.sort (jsi, 0, DESCENDING);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
630 octave_idx_type nj = js.numel ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
631 bool dups = false;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
632 for (octave_idx_type i = 0; i < nj - 1; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
633 dups = dups && js(i) == js(i+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
634
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
635 if (dups)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
636 (*current_liboctave_error_handler) ("qrinsert: duplicate index detected");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
637 if (nj > 0 && (js(0) > n-1 || js(nj-1) < 0))
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
638 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
639
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
640 if (nj > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
641 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
642 OCTAVE_LOCAL_BUFFER (double, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
643 for (volatile octave_idx_type i = 0; i < js.numel (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
644 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
645 octave_idx_type ii = i;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
646 F77_XFCN (dqrdec, DQRDEC, (m, n - ii, k == m ? k : k - ii,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
647 q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
648 r.fortran_vec (), r.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
649 js(ii) + 1, w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
650 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
651 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
652 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
653 q.resize (m, k - nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
654 r.resize (k - nj, n - nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
655 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
656 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
657 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
658 r.resize (k, n - nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
659 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
660
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
661 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
662 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
663
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
664 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
665 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
666 qr<Matrix>::insert_row (const RowVector& u, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
667 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
668 octave_idx_type m = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
669 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
670 octave_idx_type k = std::min (m, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
671
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
672 if (! q.is_square () || u.numel () != n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
673 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
674 if (j < 0 || j > m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
675 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
676
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
677 q.resize (m + 1, m + 1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
678 r.resize (m + 1, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
679 RowVector utmp = u;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
680 OCTAVE_LOCAL_BUFFER (double, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
681 F77_XFCN (dqrinr, DQRINR, (m, n, q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
682 r.fortran_vec (), r.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
683 j + 1, utmp.fortran_vec (), w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
684
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
685 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
686
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
687 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
688 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
689 qr<Matrix>::delete_row (octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
690 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
691 octave_idx_type m = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
692 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
693
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
694 if (! q.is_square ())
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
695 (*current_liboctave_error_handler) ("qrdelete: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
696 if (j < 0 || j > m-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
697 (*current_liboctave_error_handler) ("qrdelete: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
698
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
699 OCTAVE_LOCAL_BUFFER (double, w, 2*m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
700 F77_XFCN (dqrder, DQRDER, (m, n, q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
701 r.fortran_vec (), r.rows (), j + 1,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
702 w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
703
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
704 q.resize (m - 1, m - 1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
705 r.resize (m - 1, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
706 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
707
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
708 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
709 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
710 qr<Matrix>::shift_cols (octave_idx_type i, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
711 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
712 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
713 octave_idx_type k = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
714 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
715
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
716 if (i < 0 || i > n-1 || j < 0 || j > n-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
717 (*current_liboctave_error_handler) ("qrshift: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
718
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
719 OCTAVE_LOCAL_BUFFER (double, w, 2*k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
720 F77_XFCN (dqrshc, DQRSHC, (m, n, k,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
721 q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
722 r.fortran_vec (), r.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
723 i + 1, j + 1, w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
724 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
725
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
726 #endif
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
727
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
728 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
729 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
730 qr<FloatMatrix>::form (octave_idx_type n, FloatMatrix& afact, float *tau, type qr_type)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
731 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
732 octave_idx_type m = afact.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
733 octave_idx_type min_mn = std::min (m, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
734 octave_idx_type info;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
735
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
736 if (qr_type == qr<FloatMatrix>::raw)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
737 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
738 for (octave_idx_type j = 0; j < min_mn; j++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
739 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
740 octave_idx_type limit = j < min_mn - 1 ? j : min_mn - 1;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
741 for (octave_idx_type i = limit + 1; i < m; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
742 afact.elem (i, j) *= tau[j];
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
743 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
744
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
745 r = afact;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
746 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
747 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
748 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
749 // Attempt to minimize copying.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
750 if (m >= n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
751 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
752 // afact will become q.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
753 q = afact;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
754 octave_idx_type k = qr_type == qr<FloatMatrix>::economy ? n : m;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
755 r = FloatMatrix (k, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
756 for (octave_idx_type j = 0; j < n; j++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
757 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
758 octave_idx_type i = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
759 for (; i <= j; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
760 r.xelem (i, j) = afact.xelem (i, j);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
761 for (; i < k; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
762 r.xelem (i, j) = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
763 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
764 afact = FloatMatrix (); // optimize memory
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
765 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
766 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
767 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
768 // afact will become r.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
769 q = FloatMatrix (m, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
770 for (octave_idx_type j = 0; j < m; j++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
771 for (octave_idx_type i = j + 1; i < m; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
772 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
773 q.xelem (i, j) = afact.xelem (i, j);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
774 afact.xelem (i, j) = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
775 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
776 r = afact;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
777 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
778
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
779 if (m > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
780 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
781 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
782 // workspace query.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
783 float rlwork;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
784 F77_XFCN (sorgqr, SORGQR, (m, k, min_mn, q.fortran_vec (), m, tau,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
785 &rlwork, -1, info));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
786
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
787 // allocate buffer and do the job.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
788 octave_idx_type lwork = rlwork;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
789 lwork = std::max (lwork, static_cast<octave_idx_type> (1));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
790 OCTAVE_LOCAL_BUFFER (float, work, lwork);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
791 F77_XFCN (sorgqr, SORGQR, (m, k, min_mn, q.fortran_vec (), m, tau,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
792 work, lwork, info));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
793 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
794 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
795 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
796
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
797 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
798 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
799 qr<FloatMatrix>::init (const FloatMatrix& a, type qr_type)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
800 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
801 octave_idx_type m = a.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
802 octave_idx_type n = a.cols ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
803
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
804 octave_idx_type min_mn = m < n ? m : n;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
805 OCTAVE_LOCAL_BUFFER (float, tau, min_mn);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
806
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
807 octave_idx_type info = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
808
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
809 FloatMatrix afact = a;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
810 if (m > n && qr_type == qr<FloatMatrix>::std)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
811 afact.resize (m, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
812
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
813 if (m > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
814 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
815 // workspace query.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
816 float rlwork;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
817 F77_XFCN (sgeqrf, SGEQRF, (m, n, afact.fortran_vec (), m, tau,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
818 &rlwork, -1, info));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
819
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
820 // allocate buffer and do the job.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
821 octave_idx_type lwork = rlwork;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
822 lwork = std::max (lwork, static_cast<octave_idx_type> (1));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
823 OCTAVE_LOCAL_BUFFER (float, work, lwork);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
824 F77_XFCN (sgeqrf, SGEQRF, (m, n, afact.fortran_vec (), m, tau,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
825 work, lwork, info));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
826 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
827
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
828 form (n, afact, tau, qr_type);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
829 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
830
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21301
diff changeset
831 #if defined (HAVE_QRUPDATE)
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
832
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
833 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
834 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
835 qr<FloatMatrix>::update (const FloatColumnVector& u, const FloatColumnVector& v)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
836 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
837 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
838 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
839 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
840
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
841 if (u.numel () != m || v.numel () != n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
842 (*current_liboctave_error_handler) ("qrupdate: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
843
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
844 FloatColumnVector utmp = u;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
845 FloatColumnVector vtmp = v;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
846 OCTAVE_LOCAL_BUFFER (float, w, 2*k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
847 F77_XFCN (sqr1up, SQR1UP, (m, n, k, q.fortran_vec (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
848 m, r.fortran_vec (), k,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
849 utmp.fortran_vec (), vtmp.fortran_vec (), w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
850 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
851
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
852 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
853 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
854 qr<FloatMatrix>::update (const FloatMatrix& u, const FloatMatrix& v)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
855 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
856 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
857 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
858 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
859
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
860 if (u.rows () != m || v.rows () != n || u.cols () != v.cols ())
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
861 (*current_liboctave_error_handler) ("qrupdate: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
862
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
863 OCTAVE_LOCAL_BUFFER (float, w, 2*k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
864 for (volatile octave_idx_type i = 0; i < u.cols (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
865 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
866 FloatColumnVector utmp = u.column (i);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
867 FloatColumnVector vtmp = v.column (i);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
868 F77_XFCN (sqr1up, SQR1UP, (m, n, k, q.fortran_vec (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
869 m, r.fortran_vec (), k,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
870 utmp.fortran_vec (), vtmp.fortran_vec (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
871 w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
872 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
873 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
874
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
875 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
876 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
877 qr<FloatMatrix>::insert_col (const FloatColumnVector& u, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
878 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
879 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
880 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
881 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
882
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
883 if (u.numel () != m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
884 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
885 if (j < 0 || j > n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
886 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
887
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
888 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
889 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
890 q.resize (m, k+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
891 r.resize (k+1, n+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
892 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
893 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
894 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
895 r.resize (k, n+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
896 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
897
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
898 FloatColumnVector utmp = u;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
899 OCTAVE_LOCAL_BUFFER (float, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
900 F77_XFCN (sqrinc, SQRINC, (m, n, k, q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
901 r.fortran_vec (), r.rows (), j + 1,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
902 utmp.data (), w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
903 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
904
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
905 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
906 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
907 qr<FloatMatrix>::insert_col (const FloatMatrix& u, const Array<octave_idx_type>& j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
908 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
909 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
910 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
911 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
912
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
913 Array<octave_idx_type> jsi;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
914 Array<octave_idx_type> js = j.sort (jsi, 0, ASCENDING);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
915 octave_idx_type nj = js.numel ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
916 bool dups = false;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
917 for (octave_idx_type i = 0; i < nj - 1; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
918 dups = dups && js(i) == js(i+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
919
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
920 if (dups)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
921 (*current_liboctave_error_handler) ("qrinsert: duplicate index detected");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
922 if (u.numel () != m || u.columns () != nj)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
923 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
924 if (nj > 0 && (js(0) < 0 || js(nj-1) > n))
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
925 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
926
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
927 if (nj > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
928 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
929 octave_idx_type kmax = std::min (k + nj, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
930 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
931 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
932 q.resize (m, kmax);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
933 r.resize (kmax, n + nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
934 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
935 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
936 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
937 r.resize (k, n + nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
938 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
939
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
940 OCTAVE_LOCAL_BUFFER (float, w, kmax);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
941 for (volatile octave_idx_type i = 0; i < js.numel (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
942 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
943 octave_idx_type ii = i;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
944 FloatColumnVector utmp = u.column (jsi(i));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
945 F77_XFCN (sqrinc, SQRINC, (m, n + ii, std::min (kmax, k + ii),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
946 q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
947 r.fortran_vec (), r.rows (), js(ii) + 1,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
948 utmp.data (), w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
949 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
950 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
951 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
952
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
953 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
954 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
955 qr<FloatMatrix>::delete_col (octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
956 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
957 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
958 octave_idx_type k = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
959 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
960
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
961 if (j < 0 || j > n-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
962 (*current_liboctave_error_handler) ("qrdelete: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
963
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
964 OCTAVE_LOCAL_BUFFER (float, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
965 F77_XFCN (sqrdec, SQRDEC, (m, n, k, q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
966 r.fortran_vec (), r.rows (), j + 1, w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
967
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
968 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
969 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
970 q.resize (m, k-1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
971 r.resize (k-1, n-1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
972 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
973 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
974 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
975 r.resize (k, n-1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
976 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
977 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
978
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
979 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
980 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
981 qr<FloatMatrix>::delete_col (const Array<octave_idx_type>& j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
982 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
983 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
984 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
985 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
986
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
987 Array<octave_idx_type> jsi;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
988 Array<octave_idx_type> js = j.sort (jsi, 0, DESCENDING);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
989 octave_idx_type nj = js.numel ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
990 bool dups = false;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
991 for (octave_idx_type i = 0; i < nj - 1; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
992 dups = dups && js(i) == js(i+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
993
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
994 if (dups)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
995 (*current_liboctave_error_handler) ("qrinsert: duplicate index detected");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
996 if (nj > 0 && (js(0) > n-1 || js(nj-1) < 0))
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
997 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
998
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
999 if (nj > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1000 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1001 OCTAVE_LOCAL_BUFFER (float, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1002 for (volatile octave_idx_type i = 0; i < js.numel (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1003 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1004 octave_idx_type ii = i;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1005 F77_XFCN (sqrdec, SQRDEC, (m, n - ii, k == m ? k : k - ii,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1006 q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1007 r.fortran_vec (), r.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1008 js(ii) + 1, w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1009 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1010 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1011 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1012 q.resize (m, k - nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1013 r.resize (k - nj, n - nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1014 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1015 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1016 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1017 r.resize (k, n - nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1018 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1019
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1020 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1021 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1022
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1023 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1024 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1025 qr<FloatMatrix>::insert_row (const FloatRowVector& u, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1026 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1027 octave_idx_type m = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1028 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1029 octave_idx_type k = std::min (m, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1030
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1031 if (! q.is_square () || u.numel () != n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1032 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1033 if (j < 0 || j > m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1034 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1035
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1036 q.resize (m + 1, m + 1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1037 r.resize (m + 1, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1038 FloatRowVector utmp = u;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1039 OCTAVE_LOCAL_BUFFER (float, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1040 F77_XFCN (sqrinr, SQRINR, (m, n, q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1041 r.fortran_vec (), r.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1042 j + 1, utmp.fortran_vec (), w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1043
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1044 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1045
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1046 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1047 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1048 qr<FloatMatrix>::delete_row (octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1049 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1050 octave_idx_type m = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1051 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1052
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1053 if (! q.is_square ())
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1054 (*current_liboctave_error_handler) ("qrdelete: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1055 if (j < 0 || j > m-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1056 (*current_liboctave_error_handler) ("qrdelete: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1057
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1058 OCTAVE_LOCAL_BUFFER (float, w, 2*m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1059 F77_XFCN (sqrder, SQRDER, (m, n, q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1060 r.fortran_vec (), r.rows (), j + 1,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1061 w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1062
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1063 q.resize (m - 1, m - 1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1064 r.resize (m - 1, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1065 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1066
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1067 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1068 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1069 qr<FloatMatrix>::shift_cols (octave_idx_type i, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1070 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1071 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1072 octave_idx_type k = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1073 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1074
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1075 if (i < 0 || i > n-1 || j < 0 || j > n-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1076 (*current_liboctave_error_handler) ("qrshift: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1077
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1078 OCTAVE_LOCAL_BUFFER (float, w, 2*k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1079 F77_XFCN (sqrshc, SQRSHC, (m, n, k,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1080 q.fortran_vec (), q.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1081 r.fortran_vec (), r.rows (),
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1082 i + 1, j + 1, w));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1083 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1084
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1085 #endif
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1086
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1087 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1088 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1089 qr<ComplexMatrix>::form (octave_idx_type n, ComplexMatrix& afact,
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1090 Complex *tau, type qr_type)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1091 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1092 octave_idx_type m = afact.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1093 octave_idx_type min_mn = std::min (m, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1094 octave_idx_type info;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1095
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1096 if (qr_type == qr<ComplexMatrix>::raw)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1097 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1098 for (octave_idx_type j = 0; j < min_mn; j++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1099 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1100 octave_idx_type limit = j < min_mn - 1 ? j : min_mn - 1;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1101 for (octave_idx_type i = limit + 1; i < m; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1102 afact.elem (i, j) *= tau[j];
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1103 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1104
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1105 r = afact;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1106 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1107 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1108 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1109 // Attempt to minimize copying.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1110 if (m >= n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1111 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1112 // afact will become q.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1113 q = afact;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1114 octave_idx_type k = qr_type == qr<ComplexMatrix>::economy ? n : m;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1115 r = ComplexMatrix (k, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1116 for (octave_idx_type j = 0; j < n; j++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1117 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1118 octave_idx_type i = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1119 for (; i <= j; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1120 r.xelem (i, j) = afact.xelem (i, j);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1121 for (; i < k; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1122 r.xelem (i, j) = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1123 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1124 afact = ComplexMatrix (); // optimize memory
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1125 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1126 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1127 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1128 // afact will become r.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1129 q = ComplexMatrix (m, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1130 for (octave_idx_type j = 0; j < m; j++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1131 for (octave_idx_type i = j + 1; i < m; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1132 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1133 q.xelem (i, j) = afact.xelem (i, j);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1134 afact.xelem (i, j) = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1135 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1136 r = afact;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1137 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1138
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1139 if (m > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1140 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1141 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1142 // workspace query.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1143 Complex clwork;
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1144 F77_XFCN (zungqr, ZUNGQR, (m, k, min_mn, F77_DBLE_CMPLX_ARG (q.fortran_vec ()), m, F77_DBLE_CMPLX_ARG (tau),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1145 F77_DBLE_CMPLX_ARG (&clwork), -1, info));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1146
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1147 // allocate buffer and do the job.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1148 octave_idx_type lwork = clwork.real ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1149 lwork = std::max (lwork, static_cast<octave_idx_type> (1));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1150 OCTAVE_LOCAL_BUFFER (Complex, work, lwork);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1151 F77_XFCN (zungqr, ZUNGQR, (m, k, min_mn, F77_DBLE_CMPLX_ARG (q.fortran_vec ()), m, F77_DBLE_CMPLX_ARG (tau),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1152 F77_DBLE_CMPLX_ARG (work), lwork, info));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1153 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1154 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1155 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1156
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1157 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1158 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1159 qr<ComplexMatrix>::init (const ComplexMatrix& a, type qr_type)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1160 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1161 octave_idx_type m = a.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1162 octave_idx_type n = a.cols ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1163
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1164 octave_idx_type min_mn = m < n ? m : n;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1165 OCTAVE_LOCAL_BUFFER (Complex, tau, min_mn);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1166
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1167 octave_idx_type info = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1168
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1169 ComplexMatrix afact = a;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1170 if (m > n && qr_type == qr<ComplexMatrix>::std)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1171 afact.resize (m, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1172
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1173 if (m > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1174 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1175 // workspace query.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1176 Complex clwork;
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1177 F77_XFCN (zgeqrf, ZGEQRF, (m, n, F77_DBLE_CMPLX_ARG (afact.fortran_vec ()), m, F77_DBLE_CMPLX_ARG (tau),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1178 F77_DBLE_CMPLX_ARG (&clwork), -1, info));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1179
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1180 // allocate buffer and do the job.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1181 octave_idx_type lwork = clwork.real ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1182 lwork = std::max (lwork, static_cast<octave_idx_type> (1));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1183 OCTAVE_LOCAL_BUFFER (Complex, work, lwork);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1184 F77_XFCN (zgeqrf, ZGEQRF, (m, n, F77_DBLE_CMPLX_ARG (afact.fortran_vec ()), m, F77_DBLE_CMPLX_ARG (tau),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1185 F77_DBLE_CMPLX_ARG (work), lwork, info));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1186 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1187
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1188 form (n, afact, tau, qr_type);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1189 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1190
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1191 #if defined (HAVE_QRUPDATE)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1192
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1193 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1194 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1195 qr<ComplexMatrix>::update (const ComplexColumnVector& u, const ComplexColumnVector& v)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1196 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1197 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1198 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1199 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1200
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1201 if (u.numel () != m || v.numel () != n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1202 (*current_liboctave_error_handler) ("qrupdate: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1203
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1204 ComplexColumnVector utmp = u;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1205 ComplexColumnVector vtmp = v;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1206 OCTAVE_LOCAL_BUFFER (Complex, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1207 OCTAVE_LOCAL_BUFFER (double, rw, k);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1208 F77_XFCN (zqr1up, ZQR1UP, (m, n, k, F77_DBLE_CMPLX_ARG (q.fortran_vec ()),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1209 m, F77_DBLE_CMPLX_ARG (r.fortran_vec ()), k,
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1210 F77_DBLE_CMPLX_ARG (utmp.fortran_vec ()), F77_DBLE_CMPLX_ARG (vtmp.fortran_vec ()),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1211 F77_DBLE_CMPLX_ARG (w), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1212 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1213
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1214 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1215 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1216 qr<ComplexMatrix>::update (const ComplexMatrix& u, const ComplexMatrix& v)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1217 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1218 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1219 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1220 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1221
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1222 if (u.rows () != m || v.rows () != n || u.cols () != v.cols ())
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1223 (*current_liboctave_error_handler) ("qrupdate: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1224
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1225 OCTAVE_LOCAL_BUFFER (Complex, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1226 OCTAVE_LOCAL_BUFFER (double, rw, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1227 for (volatile octave_idx_type i = 0; i < u.cols (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1228 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1229 ComplexColumnVector utmp = u.column (i);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1230 ComplexColumnVector vtmp = v.column (i);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1231 F77_XFCN (zqr1up, ZQR1UP, (m, n, k, F77_DBLE_CMPLX_ARG (q.fortran_vec ()),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1232 m, F77_DBLE_CMPLX_ARG (r.fortran_vec ()), k,
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1233 F77_DBLE_CMPLX_ARG (utmp.fortran_vec ()), F77_DBLE_CMPLX_ARG (vtmp.fortran_vec ()),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1234 F77_DBLE_CMPLX_ARG (w), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1235 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1236 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1237
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1238 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1239 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1240 qr<ComplexMatrix>::insert_col (const ComplexColumnVector& u, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1241 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1242 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1243 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1244 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1245
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1246 if (u.numel () != m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1247 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1248 if (j < 0 || j > n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1249 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1250
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1251 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1252 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1253 q.resize (m, k+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1254 r.resize (k+1, n+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1255 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1256 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1257 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1258 r.resize (k, n+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1259 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1260
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1261 ComplexColumnVector utmp = u;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1262 OCTAVE_LOCAL_BUFFER (double, rw, k);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1263 F77_XFCN (zqrinc, ZQRINC, (m, n, k, F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1264 F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (), j + 1,
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1265 F77_CONST_DBLE_CMPLX_ARG (utmp.data ()), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1266 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1267
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1268 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1269 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1270 qr<ComplexMatrix>::insert_col (const ComplexMatrix& u, const Array<octave_idx_type>& j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1271 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1272 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1273 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1274 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1275
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1276 Array<octave_idx_type> jsi;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1277 Array<octave_idx_type> js = j.sort (jsi, 0, ASCENDING);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1278 octave_idx_type nj = js.numel ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1279 bool dups = false;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1280 for (octave_idx_type i = 0; i < nj - 1; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1281 dups = dups && js(i) == js(i+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1282
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1283 if (dups)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1284 (*current_liboctave_error_handler) ("qrinsert: duplicate index detected");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1285 if (u.numel () != m || u.columns () != nj)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1286 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1287 if (nj > 0 && (js(0) < 0 || js(nj-1) > n))
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1288 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1289
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1290 if (nj > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1291 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1292 octave_idx_type kmax = std::min (k + nj, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1293 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1294 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1295 q.resize (m, kmax);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1296 r.resize (kmax, n + nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1297 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1298 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1299 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1300 r.resize (k, n + nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1301 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1302
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1303 OCTAVE_LOCAL_BUFFER (double, rw, kmax);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1304 for (volatile octave_idx_type i = 0; i < js.numel (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1305 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1306 octave_idx_type ii = i;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1307 ComplexColumnVector utmp = u.column (jsi(i));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1308 F77_XFCN (zqrinc, ZQRINC, (m, n + ii, std::min (kmax, k + ii),
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1309 F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1310 F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (), js(ii) + 1,
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1311 F77_CONST_DBLE_CMPLX_ARG (utmp.data ()), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1312 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1313 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1314 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1315
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1316 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1317 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1318 qr<ComplexMatrix>::delete_col (octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1319 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1320 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1321 octave_idx_type k = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1322 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1323
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1324 if (j < 0 || j > n-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1325 (*current_liboctave_error_handler) ("qrdelete: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1326
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1327 OCTAVE_LOCAL_BUFFER (double, rw, k);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1328 F77_XFCN (zqrdec, ZQRDEC, (m, n, k, F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1329 F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (), j + 1, rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1330
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1331 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1332 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1333 q.resize (m, k-1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1334 r.resize (k-1, n-1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1335 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1336 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1337 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1338 r.resize (k, n-1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1339 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1340 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1341
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1342 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1343 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1344 qr<ComplexMatrix>::delete_col (const Array<octave_idx_type>& j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1345 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1346 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1347 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1348 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1349
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1350 Array<octave_idx_type> jsi;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1351 Array<octave_idx_type> js = j.sort (jsi, 0, DESCENDING);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1352 octave_idx_type nj = js.numel ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1353 bool dups = false;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1354 for (octave_idx_type i = 0; i < nj - 1; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1355 dups = dups && js(i) == js(i+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1356
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1357 if (dups)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1358 (*current_liboctave_error_handler) ("qrinsert: duplicate index detected");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1359 if (nj > 0 && (js(0) > n-1 || js(nj-1) < 0))
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1360 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1361
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1362 if (nj > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1363 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1364 OCTAVE_LOCAL_BUFFER (double, rw, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1365 for (volatile octave_idx_type i = 0; i < js.numel (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1366 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1367 octave_idx_type ii = i;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1368 F77_XFCN (zqrdec, ZQRDEC, (m, n - ii, k == m ? k : k - ii,
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1369 F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1370 F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (),
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1371 js(ii) + 1, rw));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1372 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1373 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1374 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1375 q.resize (m, k - nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1376 r.resize (k - nj, n - nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1377 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1378 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1379 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1380 r.resize (k, n - nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1381 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1382
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1383 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1384 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1385
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1386 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1387 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1388 qr<ComplexMatrix>::insert_row (const ComplexRowVector& u, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1389 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1390 octave_idx_type m = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1391 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1392 octave_idx_type k = std::min (m, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1393
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1394 if (! q.is_square () || u.numel () != n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1395 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1396 if (j < 0 || j > m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1397 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1398
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1399 q.resize (m + 1, m + 1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1400 r.resize (m + 1, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1401 ComplexRowVector utmp = u;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1402 OCTAVE_LOCAL_BUFFER (double, rw, k);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1403 F77_XFCN (zqrinr, ZQRINR, (m, n, F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1404 F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1405 j + 1, F77_DBLE_CMPLX_ARG (utmp.fortran_vec ()), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1406
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1407 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1408
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1409 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1410 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1411 qr<ComplexMatrix>::delete_row (octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1412 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1413 octave_idx_type m = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1414 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1415
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1416 if (! q.is_square ())
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1417 (*current_liboctave_error_handler) ("qrdelete: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1418 if (j < 0 || j > m-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1419 (*current_liboctave_error_handler) ("qrdelete: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1420
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1421 OCTAVE_LOCAL_BUFFER (Complex, w, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1422 OCTAVE_LOCAL_BUFFER (double, rw, m);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1423 F77_XFCN (zqrder, ZQRDER, (m, n, F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1424 F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (), j + 1,
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1425 F77_DBLE_CMPLX_ARG (w), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1426
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1427 q.resize (m - 1, m - 1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1428 r.resize (m - 1, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1429 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1430
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1431 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1432 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1433 qr<ComplexMatrix>::shift_cols (octave_idx_type i, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1434 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1435 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1436 octave_idx_type k = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1437 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1438
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1439 if (i < 0 || i > n-1 || j < 0 || j > n-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1440 (*current_liboctave_error_handler) ("qrshift: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1441
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1442 OCTAVE_LOCAL_BUFFER (Complex, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1443 OCTAVE_LOCAL_BUFFER (double, rw, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1444 F77_XFCN (zqrshc, ZQRSHC, (m, n, k,
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1445 F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1446 F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1447 i + 1, j + 1, F77_DBLE_CMPLX_ARG (w), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1448 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1449
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1450 #endif
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1451
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1452 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1453 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1454 qr<FloatComplexMatrix>::form (octave_idx_type n, FloatComplexMatrix& afact, FloatComplex *tau, type qr_type)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1455 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1456 octave_idx_type m = afact.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1457 octave_idx_type min_mn = std::min (m, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1458 octave_idx_type info;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1459
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1460 if (qr_type == qr<FloatComplexMatrix>::raw)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1461 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1462 for (octave_idx_type j = 0; j < min_mn; j++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1463 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1464 octave_idx_type limit = j < min_mn - 1 ? j : min_mn - 1;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1465 for (octave_idx_type i = limit + 1; i < m; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1466 afact.elem (i, j) *= tau[j];
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1467 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1468
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1469 r = afact;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1470 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1471 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1472 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1473 // Attempt to minimize copying.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1474 if (m >= n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1475 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1476 // afact will become q.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1477 q = afact;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1478 octave_idx_type k = qr_type == qr<FloatComplexMatrix>::economy ? n : m;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1479 r = FloatComplexMatrix (k, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1480 for (octave_idx_type j = 0; j < n; j++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1481 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1482 octave_idx_type i = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1483 for (; i <= j; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1484 r.xelem (i, j) = afact.xelem (i, j);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1485 for (; i < k; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1486 r.xelem (i, j) = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1487 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1488 afact = FloatComplexMatrix (); // optimize memory
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1489 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1490 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1491 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1492 // afact will become r.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1493 q = FloatComplexMatrix (m, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1494 for (octave_idx_type j = 0; j < m; j++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1495 for (octave_idx_type i = j + 1; i < m; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1496 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1497 q.xelem (i, j) = afact.xelem (i, j);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1498 afact.xelem (i, j) = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1499 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1500 r = afact;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1501 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1502
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1503 if (m > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1504 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1505 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1506 // workspace query.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1507 FloatComplex clwork;
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1508 F77_XFCN (cungqr, CUNGQR, (m, k, min_mn, F77_CMPLX_ARG (q.fortran_vec ()), m, F77_CMPLX_ARG (tau),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1509 F77_CMPLX_ARG (&clwork), -1, info));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1510
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1511 // allocate buffer and do the job.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1512 octave_idx_type lwork = clwork.real ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1513 lwork = std::max (lwork, static_cast<octave_idx_type> (1));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1514 OCTAVE_LOCAL_BUFFER (FloatComplex, work, lwork);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1515 F77_XFCN (cungqr, CUNGQR, (m, k, min_mn, F77_CMPLX_ARG (q.fortran_vec ()), m, F77_CMPLX_ARG (tau),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1516 F77_CMPLX_ARG (work), lwork, info));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1517 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1518 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1519 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1520
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1521 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1522 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1523 qr<FloatComplexMatrix>::init (const FloatComplexMatrix& a, type qr_type)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1524 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1525 octave_idx_type m = a.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1526 octave_idx_type n = a.cols ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1527
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1528 octave_idx_type min_mn = m < n ? m : n;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1529 OCTAVE_LOCAL_BUFFER (FloatComplex, tau, min_mn);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1530
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1531 octave_idx_type info = 0;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1532
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1533 FloatComplexMatrix afact = a;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1534 if (m > n && qr_type == qr<FloatComplexMatrix>::std)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1535 afact.resize (m, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1536
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1537 if (m > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1538 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1539 // workspace query.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1540 FloatComplex clwork;
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1541 F77_XFCN (cgeqrf, CGEQRF, (m, n, F77_CMPLX_ARG (afact.fortran_vec ()), m, F77_CMPLX_ARG (tau),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1542 F77_CMPLX_ARG (&clwork), -1, info));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1543
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1544 // allocate buffer and do the job.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1545 octave_idx_type lwork = clwork.real ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1546 lwork = std::max (lwork, static_cast<octave_idx_type> (1));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1547 OCTAVE_LOCAL_BUFFER (FloatComplex, work, lwork);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1548 F77_XFCN (cgeqrf, CGEQRF, (m, n, F77_CMPLX_ARG (afact.fortran_vec ()), m, F77_CMPLX_ARG (tau),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1549 F77_CMPLX_ARG (work), lwork, info));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1550 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1551
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1552 form (n, afact, tau, qr_type);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1553 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1554
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21301
diff changeset
1555 #if defined (HAVE_QRUPDATE)
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1556
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1557 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1558 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1559 qr<FloatComplexMatrix>::update (const FloatComplexColumnVector& u, const FloatComplexColumnVector& v)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1560 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1561 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1562 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1563 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1564
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1565 if (u.numel () != m || v.numel () != n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1566 (*current_liboctave_error_handler) ("qrupdate: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1567
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1568 FloatComplexColumnVector utmp = u;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1569 FloatComplexColumnVector vtmp = v;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1570 OCTAVE_LOCAL_BUFFER (FloatComplex, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1571 OCTAVE_LOCAL_BUFFER (float, rw, k);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1572 F77_XFCN (cqr1up, CQR1UP, (m, n, k, F77_CMPLX_ARG (q.fortran_vec ()),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1573 m, F77_CMPLX_ARG (r.fortran_vec ()), k,
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1574 F77_CMPLX_ARG (utmp.fortran_vec ()), F77_CMPLX_ARG (vtmp.fortran_vec ()),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1575 F77_CMPLX_ARG (w), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1576 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1577
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1578 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1579 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1580 qr<FloatComplexMatrix>::update (const FloatComplexMatrix& u, const FloatComplexMatrix& v)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1581 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1582 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1583 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1584 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1585
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1586 if (u.rows () != m || v.rows () != n || u.cols () != v.cols ())
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1587 (*current_liboctave_error_handler) ("qrupdate: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1588
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1589 OCTAVE_LOCAL_BUFFER (FloatComplex, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1590 OCTAVE_LOCAL_BUFFER (float, rw, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1591 for (volatile octave_idx_type i = 0; i < u.cols (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1592 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1593 FloatComplexColumnVector utmp = u.column (i);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1594 FloatComplexColumnVector vtmp = v.column (i);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1595 F77_XFCN (cqr1up, CQR1UP, (m, n, k, F77_CMPLX_ARG (q.fortran_vec ()),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1596 m, F77_CMPLX_ARG (r.fortran_vec ()), k,
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1597 F77_CMPLX_ARG (utmp.fortran_vec ()), F77_CMPLX_ARG (vtmp.fortran_vec ()),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1598 F77_CMPLX_ARG (w), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1599 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1600 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1601
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1602 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1603 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1604 qr<FloatComplexMatrix>::insert_col (const FloatComplexColumnVector& u, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1605 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1606 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1607 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1608 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1609
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1610 if (u.numel () != m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1611 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1612 if (j < 0 || j > n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1613 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1614
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1615 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1616 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1617 q.resize (m, k+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1618 r.resize (k+1, n+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1619 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1620 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1621 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1622 r.resize (k, n+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1623 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1624
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1625 FloatComplexColumnVector utmp = u;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1626 OCTAVE_LOCAL_BUFFER (float, rw, k);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1627 F77_XFCN (cqrinc, CQRINC, (m, n, k, F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1628 F77_CMPLX_ARG (r.fortran_vec ()), r.rows (), j + 1,
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1629 F77_CONST_CMPLX_ARG (utmp.data ()), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1630 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1631
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1632 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1633 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1634 qr<FloatComplexMatrix>::insert_col (const FloatComplexMatrix& u, const Array<octave_idx_type>& j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1635 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1636 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1637 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1638 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1639
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1640 Array<octave_idx_type> jsi;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1641 Array<octave_idx_type> js = j.sort (jsi, 0, ASCENDING);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1642 octave_idx_type nj = js.numel ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1643 bool dups = false;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1644 for (octave_idx_type i = 0; i < nj - 1; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1645 dups = dups && js(i) == js(i+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1646
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1647 if (dups)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1648 (*current_liboctave_error_handler) ("qrinsert: duplicate index detected");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1649 if (u.numel () != m || u.columns () != nj)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1650 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1651 if (nj > 0 && (js(0) < 0 || js(nj-1) > n))
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1652 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1653
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1654 if (nj > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1655 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1656 octave_idx_type kmax = std::min (k + nj, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1657 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1658 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1659 q.resize (m, kmax);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1660 r.resize (kmax, n + nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1661 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1662 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1663 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1664 r.resize (k, n + nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1665 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1666
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1667 OCTAVE_LOCAL_BUFFER (float, rw, kmax);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1668 for (volatile octave_idx_type i = 0; i < js.numel (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1669 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1670 octave_idx_type ii = i;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1671 F77_XFCN (cqrinc, CQRINC, (m, n + ii, std::min (kmax, k + ii),
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1672 F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1673 F77_CMPLX_ARG (r.fortran_vec ()), r.rows (), js(ii) + 1,
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1674 F77_CONST_CMPLX_ARG (u.column (jsi(i)).data ()), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1675 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1676 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1677 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1678
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1679 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1680 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1681 qr<FloatComplexMatrix>::delete_col (octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1682 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1683 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1684 octave_idx_type k = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1685 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1686
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1687 if (j < 0 || j > n-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1688 (*current_liboctave_error_handler) ("qrdelete: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1689
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1690 OCTAVE_LOCAL_BUFFER (float, rw, k);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1691 F77_XFCN (cqrdec, CQRDEC, (m, n, k, F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1692 F77_CMPLX_ARG (r.fortran_vec ()), r.rows (), j + 1, rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1693
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1694 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1695 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1696 q.resize (m, k-1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1697 r.resize (k-1, n-1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1698 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1699 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1700 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1701 r.resize (k, n-1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1702 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1703 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1704
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1705 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1706 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1707 qr<FloatComplexMatrix>::delete_col (const Array<octave_idx_type>& j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1708 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1709 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1710 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1711 octave_idx_type k = q.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1712
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1713 Array<octave_idx_type> jsi;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1714 Array<octave_idx_type> js = j.sort (jsi, 0, DESCENDING);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1715 octave_idx_type nj = js.numel ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1716 bool dups = false;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1717 for (octave_idx_type i = 0; i < nj - 1; i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1718 dups = dups && js(i) == js(i+1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1719
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1720 if (dups)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1721 (*current_liboctave_error_handler) ("qrinsert: duplicate index detected");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1722 if (nj > 0 && (js(0) > n-1 || js(nj-1) < 0))
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1723 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1724
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1725 if (nj > 0)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1726 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1727 OCTAVE_LOCAL_BUFFER (float, rw, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1728 for (volatile octave_idx_type i = 0; i < js.numel (); i++)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1729 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1730 octave_idx_type ii = i;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1731 F77_XFCN (cqrdec, CQRDEC, (m, n - ii, k == m ? k : k - ii,
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1732 F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1733 F77_CMPLX_ARG (r.fortran_vec ()), r.rows (),
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1734 js(ii) + 1, rw));
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1735 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1736 if (k < m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1737 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1738 q.resize (m, k - nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1739 r.resize (k - nj, n - nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1740 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1741 else
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1742 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1743 r.resize (k, n - nj);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1744 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1745
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1746 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1747 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1748
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1749 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1750 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1751 qr<FloatComplexMatrix>::insert_row (const FloatComplexRowVector& u, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1752 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1753 octave_idx_type m = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1754 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1755 octave_idx_type k = std::min (m, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1756
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1757 if (! q.is_square () || u.numel () != n)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1758 (*current_liboctave_error_handler) ("qrinsert: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1759 if (j < 0 || j > m)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1760 (*current_liboctave_error_handler) ("qrinsert: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1761
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1762 q.resize (m + 1, m + 1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1763 r.resize (m + 1, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1764 FloatComplexRowVector utmp = u;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1765 OCTAVE_LOCAL_BUFFER (float, rw, k);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1766 F77_XFCN (cqrinr, CQRINR, (m, n, F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1767 F77_CMPLX_ARG (r.fortran_vec ()), r.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1768 j + 1, F77_CMPLX_ARG (utmp.fortran_vec ()), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1769
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1770 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1771
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1772 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1773 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1774 qr<FloatComplexMatrix>::delete_row (octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1775 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1776 octave_idx_type m = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1777 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1778
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1779 if (! q.is_square ())
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1780 (*current_liboctave_error_handler) ("qrdelete: dimensions mismatch");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1781 if (j < 0 || j > m-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1782 (*current_liboctave_error_handler) ("qrdelete: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1783
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1784 OCTAVE_LOCAL_BUFFER (FloatComplex, w, m);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1785 OCTAVE_LOCAL_BUFFER (float, rw, m);
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1786 F77_XFCN (cqrder, CQRDER, (m, n, F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1787 F77_CMPLX_ARG (r.fortran_vec ()), r.rows (), j + 1,
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1788 F77_CMPLX_ARG (w), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1789
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1790 q.resize (m - 1, m - 1);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1791 r.resize (m - 1, n);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1792 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1793
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1794 template <>
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1795 void
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1796 qr<FloatComplexMatrix>::shift_cols (octave_idx_type i, octave_idx_type j)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1797 {
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1798 octave_idx_type m = q.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1799 octave_idx_type k = r.rows ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1800 octave_idx_type n = r.columns ();
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1801
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1802 if (i < 0 || i > n-1 || j < 0 || j > n-1)
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1803 (*current_liboctave_error_handler) ("qrshift: index out of range");
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1804
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1805 OCTAVE_LOCAL_BUFFER (FloatComplex, w, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1806 OCTAVE_LOCAL_BUFFER (float, rw, k);
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1807 F77_XFCN (cqrshc, CQRSHC, (m, n, k,
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1808 F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1809 F77_CMPLX_ARG (r.fortran_vec ()), r.rows (),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
1810 i + 1, j + 1, F77_CMPLX_ARG (w), rw));
21279
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1811 }
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1812
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1813 #endif
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1814
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1815 // Instantiations we need.
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1816
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1817 template class qr<Matrix>;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1818
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1819 template class qr<FloatMatrix>;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1820
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1821 template class qr<ComplexMatrix>;
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1822
eb1524b07fe3 better use of templates for qr classes
John W. Eaton <jwe@octave.org>
parents: 21202
diff changeset
1823 template class qr<FloatComplexMatrix>;
22317
6ca3acf5fad8 move some new numeric classes to namespace octave::math
John W. Eaton <jwe@octave.org>
parents: 22135
diff changeset
1824
6ca3acf5fad8 move some new numeric classes to namespace octave::math
John W. Eaton <jwe@octave.org>
parents: 22135
diff changeset
1825 }
6ca3acf5fad8 move some new numeric classes to namespace octave::math
John W. Eaton <jwe@octave.org>
parents: 22135
diff changeset
1826 }