Mercurial > octave-libtiff
annotate liboctave/numeric/sparse-qr.cc @ 21176:791dcb32b657
revamp sparse QR factorizatino classes
* sparse-qr-inst.cc, sparse-qr.cc, sparse-qr.h: New files, adapted
from SparseCmplxQR.cc, SparseCmplxQR.h, SparseQR.cc, and SparseQR.h.
(sparse_qr): New template class.
* SparseCmplxQR.cc, SparseCmplxQR.h, SparseQR.cc, SparseQR.h: Delete.
* liboctave/numeric/module.mk: Update.
* dmperm.cc, qr.cc, CSparse.cc, dSparse.cc, sparse-dmsolve.cc:
Use new sparse_qr class.
* oct-sparse.h (CXSPARSE_DNAME, CXSPARSE_ZNAME):
Move macros here from SparseQR.h and SparseCmplxQR.h.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Tue, 02 Feb 2016 12:34:06 -0500 |
parents | |
children | a10f60e13243 |
rev | line source |
---|---|
21176
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1 /* |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
2 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
3 Copyright (C) 2005-2015 David Bateman |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
4 Copyright (C) 2016 John W. Eaton |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
5 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
6 This file is part of Octave. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
7 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
8 Octave is free software; you can redistribute it and/or modify it |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
9 under the terms of the GNU General Public License as published by the |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
10 Free Software Foundation; either version 3 of the License, or (at your |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
11 option) any later version. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
12 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
13 Octave is distributed in the hope that it will be useful, but WITHOUT |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
16 for more details. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
17 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
18 You should have received a copy of the GNU General Public License |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
19 along with Octave; see the file COPYING. If not, see |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
20 <http://www.gnu.org/licenses/>. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
21 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
22 */ |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
23 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
24 #ifdef HAVE_CONFIG_H |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
25 #include <config.h> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
26 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
27 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
28 #include "lo-error.h" |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
29 #include "sparse-qr.h" |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
30 #include "oct-locbuf.h" |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
31 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
32 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
33 class |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
34 cxsparse_types |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
35 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
36 public: |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
37 typedef void symbolic_type; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
38 typedef void numeric_type; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
39 }; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
40 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
41 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
42 class |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
43 cxsparse_types<SparseMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
44 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
45 public: |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
46 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
47 typedef CXSPARSE_DNAME (s) symbolic_type; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
48 typedef CXSPARSE_DNAME (n) numeric_type; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
49 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
50 }; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
51 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
52 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
53 class |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
54 cxsparse_types<SparseComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
55 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
56 public: |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
57 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
58 typedef CXSPARSE_ZNAME (s) symbolic_type; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
59 typedef CXSPARSE_ZNAME (n) numeric_type; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
60 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
61 }; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
62 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
63 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
64 class sparse_qr<SPARSE_T>::sparse_qr_rep |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
65 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
66 public: |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
67 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
68 sparse_qr_rep (const SPARSE_T& a, int order); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
69 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
70 ~sparse_qr_rep (void); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
71 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
72 bool ok (void) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
73 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
74 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
75 return (N && S); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
76 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
77 return false; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
78 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
79 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
80 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
81 SPARSE_T V (void) const; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
82 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
83 ColumnVector Pinv (void) const; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
84 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
85 ColumnVector P (void) const; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
86 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
87 SPARSE_T R (bool econ) const; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
88 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
89 typename SPARSE_T::dense_matrix_type |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
90 C (const typename SPARSE_T::dense_matrix_type& b) const; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
91 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
92 typename SPARSE_T::dense_matrix_type |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
93 Q (void) const; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
94 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
95 octave_refcount<int> count; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
96 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
97 octave_idx_type nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
98 octave_idx_type ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
99 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
100 typename cxsparse_types<SPARSE_T>::symbolic_type *S; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
101 typename cxsparse_types<SPARSE_T>::numeric_type *N; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
102 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
103 template <typename RHS_T, typename RET_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
104 RET_T |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
105 tall_solve (const RHS_T& b, octave_idx_type& info) const; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
106 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
107 template <typename RHS_T, typename RET_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
108 RET_T |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
109 wide_solve (const RHS_T& b, octave_idx_type& info) const; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
110 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
111 private: |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
112 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
113 // No copying! |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
114 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
115 sparse_qr_rep (const sparse_qr_rep&); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
116 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
117 sparse_qr_rep& operator = (const sparse_qr_rep&); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
118 }; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
119 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
120 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
121 ColumnVector |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
122 sparse_qr<SPARSE_T>::sparse_qr_rep::Pinv (void) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
123 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
124 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
125 ColumnVector ret (N->L->m); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
126 for (octave_idx_type i = 0; i < N->L->m; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
127 ret.xelem (i) = S->pinv[i]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
128 return ret; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
129 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
130 return ColumnVector (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
131 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
132 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
133 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
134 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
135 ColumnVector |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
136 sparse_qr<SPARSE_T>::sparse_qr_rep::P (void) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
137 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
138 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
139 ColumnVector ret (N->L->m); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
140 for (octave_idx_type i = 0; i < N->L->m; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
141 ret.xelem (S->pinv[i]) = i; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
142 return ret; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
143 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
144 return ColumnVector (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
145 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
146 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
147 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
148 // Specializations. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
149 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
150 // Real-valued matrices. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
151 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
152 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
153 sparse_qr<SparseMatrix>::sparse_qr_rep::sparse_qr_rep |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
154 (const SparseMatrix& a, int order) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
155 : count (1), nrows (a.rows ()), ncols (a.columns ()) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
156 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
157 , S (0), N (0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
158 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
159 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
160 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
161 CXSPARSE_DNAME () A; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
162 A.nzmax = a.nnz (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
163 A.m = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
164 A.n = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
165 // Cast away const on A, with full knowledge that CSparse won't touch it |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
166 // Prevents the methods below making a copy of the data. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
167 A.p = const_cast<octave_idx_type *>(a.cidx ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
168 A.i = const_cast<octave_idx_type *>(a.ridx ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
169 A.x = const_cast<double *>(a.data ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
170 A.nz = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
171 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
172 S = CXSPARSE_DNAME (_sqr) (order, &A, 1); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
173 N = CXSPARSE_DNAME (_qr) (&A, S); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
174 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
175 if (! N) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
176 (*current_liboctave_error_handler) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
177 ("sparse_qr: sparse matrix QR factorization filled"); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
178 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
179 count = 1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
180 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
181 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
182 (*current_liboctave_error_handler) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
183 ("sparse_qr: support for CXSparse was unavailable or disabled when liboctave was built"); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
184 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
185 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
186 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
187 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
188 sparse_qr<SparseMatrix>::sparse_qr_rep::~sparse_qr_rep (void) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
189 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
190 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
191 CXSPARSE_DNAME (_sfree) (S); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
192 CXSPARSE_DNAME (_nfree) (N); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
193 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
194 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
195 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
196 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
197 SparseMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
198 sparse_qr<SparseMatrix>::sparse_qr_rep::V (void) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
199 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
200 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
201 // Drop zeros from V and sort |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
202 // FIXME: Is the double transpose to sort necessary? |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
203 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
204 CXSPARSE_DNAME (_dropzeros) (N->L); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
205 CXSPARSE_DNAME () *D = CXSPARSE_DNAME (_transpose) (N->L, 1); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
206 CXSPARSE_DNAME (_spfree) (N->L); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
207 N->L = CXSPARSE_DNAME (_transpose) (D, 1); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
208 CXSPARSE_DNAME (_spfree) (D); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
209 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
210 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
211 octave_idx_type nc = N->L->n; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
212 octave_idx_type nz = N->L->nzmax; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
213 SparseMatrix ret (N->L->m, nc, nz); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
214 for (octave_idx_type j = 0; j < nc+1; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
215 ret.xcidx (j) = N->L->p[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
216 for (octave_idx_type j = 0; j < nz; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
217 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
218 ret.xridx (j) = N->L->i[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
219 ret.xdata (j) = N->L->x[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
220 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
221 return ret; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
222 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
223 return SparseMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
224 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
225 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
226 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
227 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
228 SparseMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
229 sparse_qr<SparseMatrix>::sparse_qr_rep::R (bool econ) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
230 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
231 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
232 // Drop zeros from R and sort |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
233 // FIXME: Is the double transpose to sort necessary? |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
234 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
235 CXSPARSE_DNAME (_dropzeros) (N->U); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
236 CXSPARSE_DNAME () *D = CXSPARSE_DNAME (_transpose) (N->U, 1); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
237 CXSPARSE_DNAME (_spfree) (N->U); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
238 N->U = CXSPARSE_DNAME (_transpose) (D, 1); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
239 CXSPARSE_DNAME (_spfree) (D); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
240 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
241 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
242 octave_idx_type nc = N->U->n; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
243 octave_idx_type nz = N->U->nzmax; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
244 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
245 SparseMatrix ret ((econ ? (nc > nrows ? nrows : nc) : nrows), nc, nz); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
246 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
247 for (octave_idx_type j = 0; j < nc+1; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
248 ret.xcidx (j) = N->U->p[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
249 for (octave_idx_type j = 0; j < nz; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
250 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
251 ret.xridx (j) = N->U->i[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
252 ret.xdata (j) = N->U->x[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
253 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
254 return ret; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
255 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
256 return SparseMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
257 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
258 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
259 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
260 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
261 Matrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
262 sparse_qr<SparseMatrix>::sparse_qr_rep::C (const Matrix& b) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
263 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
264 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
265 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
266 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
267 octave_idx_type nc = N->L->n; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
268 octave_idx_type nr = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
269 const double *bvec = b.fortran_vec (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
270 Matrix ret (b_nr, b_nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
271 double *vec = ret.fortran_vec (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
272 if (nr < 0 || nc < 0 || nr != b_nr) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
273 (*current_liboctave_error_handler) ("matrix dimension mismatch"); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
274 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
275 if (nr == 0 || nc == 0 || b_nc == 0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
276 ret = Matrix (nc, b_nc, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
277 else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
278 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
279 OCTAVE_LOCAL_BUFFER (double, buf, S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
280 for (volatile octave_idx_type j = 0, idx = 0; j < b_nc; j++, idx+=b_nr) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
281 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
282 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
283 for (octave_idx_type i = nr; i < S->m2; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
284 buf[i] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
285 volatile octave_idx_type nm = (nr < nc ? nr : nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
286 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
287 CXSPARSE_DNAME (_ipvec) (S->pinv, bvec + idx, buf, b_nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
288 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
289 for (volatile octave_idx_type i = 0; i < nm; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
290 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
291 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
292 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
293 CXSPARSE_DNAME (_happly) (N->L, i, N->B[i], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
294 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
295 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
296 for (octave_idx_type i = 0; i < b_nr; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
297 vec[i+idx] = buf[i]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
298 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
299 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
300 return ret; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
301 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
302 return Matrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
303 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
304 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
305 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
306 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
307 Matrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
308 sparse_qr<SparseMatrix>::sparse_qr_rep::Q (void) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
309 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
310 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
311 octave_idx_type nc = N->L->n; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
312 octave_idx_type nr = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
313 Matrix ret (nr, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
314 double *vec = ret.fortran_vec (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
315 if (nr < 0 || nc < 0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
316 (*current_liboctave_error_handler) ("matrix dimension mismatch"); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
317 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
318 if (nr == 0 || nc == 0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
319 ret = Matrix (nc, nr, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
320 else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
321 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
322 OCTAVE_LOCAL_BUFFER (double, bvec, nr + 1); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
323 for (octave_idx_type i = 0; i < nr; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
324 bvec[i] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
325 OCTAVE_LOCAL_BUFFER (double, buf, S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
326 for (volatile octave_idx_type j = 0, idx = 0; j < nr; j++, idx+=nr) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
327 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
328 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
329 bvec[j] = 1.0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
330 for (octave_idx_type i = nr; i < S->m2; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
331 buf[i] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
332 volatile octave_idx_type nm = (nr < nc ? nr : nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
333 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
334 CXSPARSE_DNAME (_ipvec) (S->pinv, bvec, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
335 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
336 for (volatile octave_idx_type i = 0; i < nm; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
337 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
338 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
339 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
340 CXSPARSE_DNAME (_happly) (N->L, i, N->B[i], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
341 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
342 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
343 for (octave_idx_type i = 0; i < nr; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
344 vec[i+idx] = buf[i]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
345 bvec[j] = 0.0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
346 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
347 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
348 return ret.transpose (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
349 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
350 return Matrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
351 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
352 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
353 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
354 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
355 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
356 Matrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
357 sparse_qr<SparseMatrix>::sparse_qr_rep::tall_solve<MArray<double>, Matrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
358 (const MArray<double>& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
359 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
360 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
361 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
362 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
363 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
364 octave_idx_type nr = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
365 octave_idx_type nc = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
366 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
367 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
368 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
369 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
370 const double *bvec = b.data (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
371 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
372 Matrix x (nc, b_nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
373 double *vec = x.fortran_vec (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
374 OCTAVE_LOCAL_BUFFER (double, buf, S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
375 for (volatile octave_idx_type i = 0, idx = 0, bidx = 0; i < b_nc; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
376 i++, idx+=nc, bidx+=b_nr) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
377 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
378 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
379 for (octave_idx_type j = nr; j < S->m2; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
380 buf[j] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
381 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
382 CXSPARSE_DNAME (_ipvec) (S->pinv, bvec + bidx, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
383 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
384 for (volatile octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
385 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
386 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
387 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
388 CXSPARSE_DNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
389 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
390 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
391 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
392 CXSPARSE_DNAME (_usolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
393 CXSPARSE_DNAME (_ipvec) (S->q, buf, vec + idx, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
394 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
395 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
396 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
397 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
398 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
399 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
400 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
401 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
402 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
403 return Matrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
404 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
405 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
406 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
407 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
408 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
409 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
410 Matrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
411 sparse_qr<SparseMatrix>::sparse_qr_rep::wide_solve<MArray<double>, Matrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
412 (const MArray<double>& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
413 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
414 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
415 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
416 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
417 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
418 // These are swapped because the original matrix was transposed in |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
419 // sparse_qr<SparseMatrix>::solve. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
420 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
421 octave_idx_type nr = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
422 octave_idx_type nc = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
423 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
424 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
425 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
426 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
427 const double *bvec = b.data (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
428 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
429 Matrix x (nc, b_nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
430 double *vec = x.fortran_vec (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
431 volatile octave_idx_type nbuf = (nc > S->m2 ? nc : S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
432 OCTAVE_LOCAL_BUFFER (double, buf, nbuf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
433 for (volatile octave_idx_type i = 0, idx = 0, bidx = 0; i < b_nc; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
434 i++, idx+=nc, bidx+=b_nr) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
435 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
436 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
437 for (octave_idx_type j = nr; j < nbuf; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
438 buf[j] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
439 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
440 CXSPARSE_DNAME (_pvec) (S->q, bvec + bidx, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
441 CXSPARSE_DNAME (_utsolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
442 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
443 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
444 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
445 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
446 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
447 CXSPARSE_DNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
448 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
449 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
450 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
451 CXSPARSE_DNAME (_pvec) (S->pinv, buf, vec + idx, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
452 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
453 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
454 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
455 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
456 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
457 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
458 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
459 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
460 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
461 return Matrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
462 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
463 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
464 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
465 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
466 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
467 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
468 SparseMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
469 sparse_qr<SparseMatrix>::sparse_qr_rep::tall_solve<SparseMatrix, SparseMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
470 (const SparseMatrix& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
471 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
472 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
473 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
474 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
475 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
476 octave_idx_type nr = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
477 octave_idx_type nc = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
478 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
479 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
480 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
481 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
482 volatile octave_idx_type ii, x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
483 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
484 SparseMatrix x (nc, b_nc, b.nnz ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
485 x.xcidx (0) = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
486 x_nz = b.nnz (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
487 ii = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
488 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
489 OCTAVE_LOCAL_BUFFER (double, buf, S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
490 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
491 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
492 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
493 for (octave_idx_type j = 0; j < b_nr; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
494 Xx[j] = b.xelem (j,i); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
495 for (octave_idx_type j = nr; j < S->m2; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
496 buf[j] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
497 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
498 CXSPARSE_DNAME (_ipvec) (S->pinv, Xx, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
499 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
500 for (volatile octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
501 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
502 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
503 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
504 CXSPARSE_DNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
505 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
506 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
507 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
508 CXSPARSE_DNAME (_usolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
509 CXSPARSE_DNAME (_ipvec) (S->q, buf, Xx, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
510 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
511 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
512 for (octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
513 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
514 double tmp = Xx[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
515 if (tmp != 0.0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
516 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
517 if (ii == x_nz) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
518 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
519 // Resize the sparse matrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
520 octave_idx_type sz = x_nz * (b_nc - i) / b_nc; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
521 sz = (sz > 10 ? sz : 10) + x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
522 x.change_capacity (sz); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
523 x_nz = sz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
524 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
525 x.xdata (ii) = tmp; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
526 x.xridx (ii++) = j; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
527 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
528 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
529 x.xcidx (i+1) = ii; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
530 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
531 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
532 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
533 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
534 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
535 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
536 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
537 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
538 return SparseMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
539 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
540 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
541 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
542 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
543 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
544 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
545 SparseMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
546 sparse_qr<SparseMatrix>::sparse_qr_rep::wide_solve<SparseMatrix, SparseMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
547 (const SparseMatrix& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
548 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
549 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
550 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
551 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
552 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
553 // These are swapped because the original matrix was transposed in |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
554 // sparse_qr<SparseMatrix>::solve. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
555 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
556 octave_idx_type nr = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
557 octave_idx_type nc = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
558 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
559 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
560 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
561 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
562 volatile octave_idx_type ii, x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
563 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
564 SparseMatrix x (nc, b_nc, b.nnz ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
565 x.xcidx (0) = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
566 x_nz = b.nnz (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
567 ii = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
568 volatile octave_idx_type nbuf = (nc > S->m2 ? nc : S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
569 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
570 OCTAVE_LOCAL_BUFFER (double, buf, nbuf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
571 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
572 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
573 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
574 for (octave_idx_type j = 0; j < b_nr; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
575 Xx[j] = b.xelem (j,i); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
576 for (octave_idx_type j = nr; j < nbuf; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
577 buf[j] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
578 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
579 CXSPARSE_DNAME (_pvec) (S->q, Xx, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
580 CXSPARSE_DNAME (_utsolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
581 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
582 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
583 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
584 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
585 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
586 CXSPARSE_DNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
587 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
588 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
589 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
590 CXSPARSE_DNAME (_pvec) (S->pinv, buf, Xx, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
591 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
592 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
593 for (octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
594 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
595 double tmp = Xx[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
596 if (tmp != 0.0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
597 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
598 if (ii == x_nz) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
599 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
600 // Resize the sparse matrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
601 octave_idx_type sz = x_nz * (b_nc - i) / b_nc; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
602 sz = (sz > 10 ? sz : 10) + x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
603 x.change_capacity (sz); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
604 x_nz = sz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
605 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
606 x.xdata (ii) = tmp; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
607 x.xridx (ii++) = j; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
608 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
609 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
610 x.xcidx (i+1) = ii; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
611 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
612 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
613 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
614 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
615 x.maybe_compress (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
616 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
617 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
618 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
619 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
620 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
621 return SparseMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
622 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
623 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
624 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
625 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
626 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
627 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
628 ComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
629 sparse_qr<SparseMatrix>::sparse_qr_rep::tall_solve<MArray<Complex>, ComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
630 (const MArray<Complex>& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
631 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
632 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
633 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
634 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
635 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
636 octave_idx_type nr = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
637 octave_idx_type nc = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
638 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
639 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
640 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
641 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
642 ComplexMatrix x (nc, b_nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
643 Complex *vec = x.fortran_vec (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
644 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
645 OCTAVE_LOCAL_BUFFER (double, Xz, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
646 OCTAVE_LOCAL_BUFFER (double, buf, S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
647 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
648 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
649 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
650 for (octave_idx_type j = 0; j < b_nr; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
651 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
652 Complex c = b.xelem (j,i); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
653 Xx[j] = std::real (c); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
654 Xz[j] = std::imag (c); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
655 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
656 for (octave_idx_type j = nr; j < S->m2; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
657 buf[j] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
658 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
659 CXSPARSE_DNAME (_ipvec) (S->pinv, Xx, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
660 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
661 for (volatile octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
662 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
663 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
664 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
665 CXSPARSE_DNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
666 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
667 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
668 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
669 CXSPARSE_DNAME (_usolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
670 CXSPARSE_DNAME (_ipvec) (S->q, buf, Xx, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
671 for (octave_idx_type j = nr; j < S->m2; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
672 buf[j] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
673 CXSPARSE_DNAME (_ipvec) (S->pinv, Xz, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
674 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
675 for (volatile octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
676 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
677 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
678 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
679 CXSPARSE_DNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
680 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
681 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
682 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
683 CXSPARSE_DNAME (_usolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
684 CXSPARSE_DNAME (_ipvec) (S->q, buf, Xz, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
685 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
686 for (octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
687 vec[j+idx] = Complex (Xx[j], Xz[j]); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
688 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
689 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
690 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
691 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
692 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
693 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
694 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
695 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
696 return ComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
697 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
698 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
699 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
700 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
701 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
702 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
703 ComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
704 sparse_qr<SparseMatrix>::sparse_qr_rep::wide_solve<MArray<Complex>, ComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
705 (const MArray<Complex>& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
706 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
707 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
708 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
709 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
710 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
711 // These are swapped because the original matrix was transposed in |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
712 // sparse_qr<SparseMatrix>::solve. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
713 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
714 octave_idx_type nr = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
715 octave_idx_type nc = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
716 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
717 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
718 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
719 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
720 ComplexMatrix x (nc, b_nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
721 Complex *vec = x.fortran_vec (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
722 volatile octave_idx_type nbuf = (nc > S->m2 ? nc : S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
723 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
724 OCTAVE_LOCAL_BUFFER (double, Xz, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
725 OCTAVE_LOCAL_BUFFER (double, buf, nbuf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
726 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
727 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
728 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
729 for (octave_idx_type j = 0; j < b_nr; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
730 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
731 Complex c = b.xelem (j,i); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
732 Xx[j] = std::real (c); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
733 Xz[j] = std::imag (c); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
734 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
735 for (octave_idx_type j = nr; j < nbuf; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
736 buf[j] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
737 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
738 CXSPARSE_DNAME (_pvec) (S->q, Xx, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
739 CXSPARSE_DNAME (_utsolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
740 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
741 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
742 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
743 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
744 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
745 CXSPARSE_DNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
746 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
747 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
748 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
749 CXSPARSE_DNAME (_pvec) (S->pinv, buf, Xx, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
750 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
751 for (octave_idx_type j = nr; j < nbuf; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
752 buf[j] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
753 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
754 CXSPARSE_DNAME (_pvec) (S->q, Xz, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
755 CXSPARSE_DNAME (_utsolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
756 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
757 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
758 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
759 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
760 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
761 CXSPARSE_DNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
762 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
763 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
764 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
765 CXSPARSE_DNAME (_pvec) (S->pinv, buf, Xz, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
766 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
767 for (octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
768 vec[j+idx] = Complex (Xx[j], Xz[j]); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
769 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
770 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
771 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
772 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
773 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
774 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
775 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
776 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
777 return ComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
778 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
779 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
780 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
781 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
782 // Complex-valued matrices. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
783 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
784 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
785 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::sparse_qr_rep |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
786 (const SparseComplexMatrix& a, int order) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
787 : count (1), nrows (a.rows ()), ncols (a.columns ()) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
788 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
789 , S (0), N (0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
790 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
791 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
792 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
793 CXSPARSE_ZNAME () A; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
794 A.nzmax = a.nnz (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
795 A.m = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
796 A.n = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
797 // Cast away const on A, with full knowledge that CSparse won't touch it |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
798 // Prevents the methods below making a copy of the data. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
799 A.p = const_cast<octave_idx_type *>(a.cidx ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
800 A.i = const_cast<octave_idx_type *>(a.ridx ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
801 A.x = const_cast<cs_complex_t *>(reinterpret_cast<const cs_complex_t *> (a.data ())); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
802 A.nz = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
803 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
804 S = CXSPARSE_ZNAME (_sqr) (order, &A, 1); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
805 N = CXSPARSE_ZNAME (_qr) (&A, S); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
806 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
807 if (! N) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
808 (*current_liboctave_error_handler) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
809 ("sparse_qr: sparse matrix QR factorization filled"); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
810 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
811 count = 1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
812 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
813 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
814 (*current_liboctave_error_handler) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
815 ("sparse_qr: support for CXSparse was unavailable or disabled when liboctave was built"); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
816 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
817 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
818 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
819 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
820 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::~sparse_qr_rep (void) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
821 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
822 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
823 CXSPARSE_ZNAME (_sfree) (S); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
824 CXSPARSE_ZNAME (_nfree) (N); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
825 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
826 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
827 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
828 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
829 SparseComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
830 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::V (void) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
831 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
832 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
833 // Drop zeros from V and sort |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
834 // FIXME: Is the double transpose to sort necessary? |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
835 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
836 CXSPARSE_ZNAME (_dropzeros) (N->L); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
837 CXSPARSE_ZNAME () *D = CXSPARSE_ZNAME (_transpose) (N->L, 1); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
838 CXSPARSE_ZNAME (_spfree) (N->L); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
839 N->L = CXSPARSE_ZNAME (_transpose) (D, 1); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
840 CXSPARSE_ZNAME (_spfree) (D); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
841 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
842 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
843 octave_idx_type nc = N->L->n; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
844 octave_idx_type nz = N->L->nzmax; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
845 SparseComplexMatrix ret (N->L->m, nc, nz); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
846 for (octave_idx_type j = 0; j < nc+1; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
847 ret.xcidx (j) = N->L->p[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
848 for (octave_idx_type j = 0; j < nz; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
849 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
850 ret.xridx (j) = N->L->i[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
851 ret.xdata (j) = reinterpret_cast<Complex *>(N->L->x)[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
852 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
853 return ret; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
854 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
855 return SparseComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
856 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
857 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
858 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
859 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
860 SparseComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
861 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::R (bool econ) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
862 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
863 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
864 // Drop zeros from R and sort |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
865 // FIXME: Is the double transpose to sort necessary? |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
866 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
867 CXSPARSE_ZNAME (_dropzeros) (N->U); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
868 CXSPARSE_ZNAME () *D = CXSPARSE_ZNAME (_transpose) (N->U, 1); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
869 CXSPARSE_ZNAME (_spfree) (N->U); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
870 N->U = CXSPARSE_ZNAME (_transpose) (D, 1); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
871 CXSPARSE_ZNAME (_spfree) (D); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
872 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
873 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
874 octave_idx_type nc = N->U->n; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
875 octave_idx_type nz = N->U->nzmax; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
876 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
877 SparseComplexMatrix ret ((econ ? (nc > nrows ? nrows : nc) : nrows), nc, nz); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
878 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
879 for (octave_idx_type j = 0; j < nc+1; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
880 ret.xcidx (j) = N->U->p[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
881 for (octave_idx_type j = 0; j < nz; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
882 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
883 ret.xridx (j) = N->U->i[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
884 ret.xdata (j) = reinterpret_cast<Complex *>(N->U->x)[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
885 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
886 return ret; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
887 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
888 return SparseComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
889 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
890 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
891 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
892 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
893 ComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
894 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::C (const ComplexMatrix& b) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
895 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
896 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
897 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
898 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
899 octave_idx_type nc = N->L->n; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
900 octave_idx_type nr = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
901 const cs_complex_t *bvec = reinterpret_cast<const cs_complex_t *>(b.fortran_vec ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
902 ComplexMatrix ret (b_nr, b_nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
903 Complex *vec = ret.fortran_vec (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
904 if (nr < 0 || nc < 0 || nr != b_nr) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
905 (*current_liboctave_error_handler) ("matrix dimension mismatch"); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
906 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
907 if (nr == 0 || nc == 0 || b_nc == 0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
908 ret = ComplexMatrix (nc, b_nc, Complex (0.0, 0.0)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
909 else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
910 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
911 OCTAVE_LOCAL_BUFFER (Complex, buf, S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
912 for (volatile octave_idx_type j = 0, idx = 0; j < b_nc; j++, idx+=b_nr) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
913 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
914 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
915 volatile octave_idx_type nm = (nr < nc ? nr : nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
916 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
917 CXSPARSE_ZNAME (_ipvec) (S->pinv, bvec + idx, reinterpret_cast<cs_complex_t *>(buf), b_nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
918 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
919 for (volatile octave_idx_type i = 0; i < nm; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
920 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
921 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
922 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
923 CXSPARSE_ZNAME (_happly) (N->L, i, N->B[i], reinterpret_cast<cs_complex_t *>(buf)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
924 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
925 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
926 for (octave_idx_type i = 0; i < b_nr; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
927 vec[i+idx] = buf[i]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
928 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
929 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
930 return ret; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
931 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
932 return ComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
933 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
934 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
935 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
936 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
937 ComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
938 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::Q (void) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
939 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
940 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
941 octave_idx_type nc = N->L->n; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
942 octave_idx_type nr = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
943 ComplexMatrix ret (nr, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
944 Complex *vec = ret.fortran_vec (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
945 if (nr < 0 || nc < 0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
946 (*current_liboctave_error_handler) ("matrix dimension mismatch"); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
947 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
948 if (nr == 0 || nc == 0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
949 ret = ComplexMatrix (nc, nr, Complex (0.0, 0.0)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
950 else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
951 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
952 OCTAVE_LOCAL_BUFFER (cs_complex_t, bvec, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
953 for (octave_idx_type i = 0; i < nr; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
954 bvec[i] = cs_complex_t (0.0, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
955 OCTAVE_LOCAL_BUFFER (Complex, buf, S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
956 for (volatile octave_idx_type j = 0, idx = 0; j < nr; j++, idx+=nr) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
957 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
958 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
959 bvec[j] = cs_complex_t (1.0, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
960 volatile octave_idx_type nm = (nr < nc ? nr : nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
961 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
962 CXSPARSE_ZNAME (_ipvec) (S->pinv, bvec, reinterpret_cast<cs_complex_t *>(buf), nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
963 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
964 for (volatile octave_idx_type i = 0; i < nm; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
965 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
966 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
967 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
968 CXSPARSE_ZNAME (_happly) (N->L, i, N->B[i], reinterpret_cast<cs_complex_t *>(buf)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
969 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
970 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
971 for (octave_idx_type i = 0; i < nr; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
972 vec[i+idx] = buf[i]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
973 bvec[j] = cs_complex_t (0.0, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
974 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
975 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
976 return ret.hermitian (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
977 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
978 return ComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
979 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
980 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
981 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
982 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
983 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
984 SparseComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
985 sparse_qr<SparseMatrix>::sparse_qr_rep::tall_solve<SparseComplexMatrix, SparseComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
986 (const SparseComplexMatrix& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
987 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
988 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
989 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
990 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
991 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
992 octave_idx_type nr = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
993 octave_idx_type nc = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
994 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
995 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
996 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
997 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
998 volatile octave_idx_type ii, x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
999 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1000 SparseComplexMatrix x (nc, b_nc, b.nnz ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1001 x.xcidx (0) = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1002 x_nz = b.nnz (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1003 ii = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1004 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1005 OCTAVE_LOCAL_BUFFER (double, Xz, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1006 OCTAVE_LOCAL_BUFFER (double, buf, S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1007 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1008 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1009 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1010 for (octave_idx_type j = 0; j < b_nr; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1011 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1012 Complex c = b.xelem (j,i); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1013 Xx[j] = std::real (c); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1014 Xz[j] = std::imag (c); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1015 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1016 for (octave_idx_type j = nr; j < S->m2; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1017 buf[j] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1018 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1019 CXSPARSE_DNAME (_ipvec) (S->pinv, Xx, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1020 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1021 for (volatile octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1022 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1023 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1024 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1025 CXSPARSE_DNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1026 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1027 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1028 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1029 CXSPARSE_DNAME (_usolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1030 CXSPARSE_DNAME (_ipvec) (S->q, buf, Xx, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1031 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1032 for (octave_idx_type j = nr; j < S->m2; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1033 buf[j] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1034 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1035 CXSPARSE_DNAME (_ipvec) (S->pinv, Xz, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1036 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1037 for (volatile octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1038 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1039 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1040 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1041 CXSPARSE_DNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1042 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1043 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1044 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1045 CXSPARSE_DNAME (_usolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1046 CXSPARSE_DNAME (_ipvec) (S->q, buf, Xz, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1047 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1048 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1049 for (octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1050 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1051 Complex tmp = Complex (Xx[j], Xz[j]); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1052 if (tmp != 0.0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1053 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1054 if (ii == x_nz) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1055 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1056 // Resize the sparse matrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1057 octave_idx_type sz = x_nz * (b_nc - i) / b_nc; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1058 sz = (sz > 10 ? sz : 10) + x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1059 x.change_capacity (sz); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1060 x_nz = sz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1061 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1062 x.xdata (ii) = tmp; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1063 x.xridx (ii++) = j; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1064 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1065 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1066 x.xcidx (i+1) = ii; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1067 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1068 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1069 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1070 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1071 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1072 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1073 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1074 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1075 return SparseComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1076 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1077 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1078 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1079 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1080 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1081 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1082 SparseComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1083 sparse_qr<SparseMatrix>::sparse_qr_rep::wide_solve<SparseComplexMatrix, SparseComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1084 (const SparseComplexMatrix& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1085 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1086 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1087 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1088 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1089 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1090 // These are swapped because the original matrix was transposed in |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1091 // sparse_qr<SparseMatrix>::solve. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1092 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1093 octave_idx_type nr = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1094 octave_idx_type nc = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1095 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1096 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1097 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1098 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1099 volatile octave_idx_type ii, x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1100 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1101 SparseComplexMatrix x (nc, b_nc, b.nnz ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1102 x.xcidx (0) = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1103 x_nz = b.nnz (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1104 ii = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1105 volatile octave_idx_type nbuf = (nc > S->m2 ? nc : S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1106 OCTAVE_LOCAL_BUFFER (double, Xx, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1107 OCTAVE_LOCAL_BUFFER (double, Xz, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1108 OCTAVE_LOCAL_BUFFER (double, buf, nbuf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1109 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1110 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1111 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1112 for (octave_idx_type j = 0; j < b_nr; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1113 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1114 Complex c = b.xelem (j,i); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1115 Xx[j] = std::real (c); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1116 Xz[j] = std::imag (c); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1117 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1118 for (octave_idx_type j = nr; j < nbuf; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1119 buf[j] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1120 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1121 CXSPARSE_DNAME (_pvec) (S->q, Xx, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1122 CXSPARSE_DNAME (_utsolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1123 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1124 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1125 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1126 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1127 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1128 CXSPARSE_DNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1129 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1130 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1131 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1132 CXSPARSE_DNAME (_pvec) (S->pinv, buf, Xx, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1133 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1134 for (octave_idx_type j = nr; j < nbuf; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1135 buf[j] = 0.; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1136 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1137 CXSPARSE_DNAME (_pvec) (S->q, Xz, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1138 CXSPARSE_DNAME (_utsolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1139 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1140 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1141 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1142 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1143 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1144 CXSPARSE_DNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1145 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1146 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1147 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1148 CXSPARSE_DNAME (_pvec) (S->pinv, buf, Xz, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1149 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1150 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1151 for (octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1152 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1153 Complex tmp = Complex (Xx[j], Xz[j]); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1154 if (tmp != 0.0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1155 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1156 if (ii == x_nz) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1157 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1158 // Resize the sparse matrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1159 octave_idx_type sz = x_nz * (b_nc - i) / b_nc; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1160 sz = (sz > 10 ? sz : 10) + x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1161 x.change_capacity (sz); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1162 x_nz = sz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1163 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1164 x.xdata (ii) = tmp; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1165 x.xridx (ii++) = j; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1166 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1167 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1168 x.xcidx (i+1) = ii; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1169 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1170 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1171 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1172 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1173 x.maybe_compress (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1174 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1175 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1176 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1177 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1178 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1179 return SparseComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1180 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1181 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1182 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1183 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1184 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1185 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1186 ComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1187 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::tall_solve<MArray<double>, ComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1188 (const MArray<double>& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1189 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1190 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1191 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1192 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1193 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1194 octave_idx_type nr = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1195 octave_idx_type nc = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1196 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1197 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1198 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1199 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1200 ComplexMatrix x (nc, b_nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1201 cs_complex_t *vec = reinterpret_cast<cs_complex_t *> (x.fortran_vec ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1202 OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1203 OCTAVE_LOCAL_BUFFER (Complex, Xx, b_nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1204 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1205 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1206 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1207 for (octave_idx_type j = 0; j < b_nr; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1208 Xx[j] = b.xelem (j,i); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1209 for (octave_idx_type j = nr; j < S->m2; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1210 buf[j] = cs_complex_t (0.0, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1211 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1212 CXSPARSE_ZNAME (_ipvec) (S->pinv, reinterpret_cast<cs_complex_t *>(Xx), buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1213 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1214 for (volatile octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1215 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1216 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1217 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1218 CXSPARSE_ZNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1219 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1220 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1221 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1222 CXSPARSE_ZNAME (_usolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1223 CXSPARSE_ZNAME (_ipvec) (S->q, buf, vec + idx, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1224 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1225 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1226 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1227 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1228 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1229 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1230 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1231 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1232 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1233 return ComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1234 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1235 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1236 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1237 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1238 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1239 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1240 ComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1241 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::wide_solve<MArray<double>, ComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1242 (const MArray<double>& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1243 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1244 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1245 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1246 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1247 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1248 // These are swapped because the original matrix was transposed in |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1249 // sparse_qr<SparseComplexMatrix>::solve. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1250 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1251 octave_idx_type nr = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1252 octave_idx_type nc = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1253 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1254 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1255 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1256 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1257 ComplexMatrix x (nc, b_nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1258 cs_complex_t *vec = reinterpret_cast<cs_complex_t *> (x.fortran_vec ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1259 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1260 volatile octave_idx_type nbuf = (nc > S->m2 ? nc : S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1261 OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, nbuf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1262 OCTAVE_LOCAL_BUFFER (Complex, Xx, b_nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1263 OCTAVE_LOCAL_BUFFER (double, B, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1264 for (octave_idx_type i = 0; i < nr; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1265 B[i] = N->B[i]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1266 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1267 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1268 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1269 for (octave_idx_type j = 0; j < b_nr; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1270 Xx[j] = b.xelem (j,i); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1271 for (octave_idx_type j = nr; j < nbuf; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1272 buf[j] = cs_complex_t (0.0, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1273 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1274 CXSPARSE_ZNAME (_pvec) (S->q, reinterpret_cast<cs_complex_t *>(Xx), buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1275 CXSPARSE_ZNAME (_utsolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1276 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1277 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1278 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1279 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1280 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1281 CXSPARSE_ZNAME (_happly) (N->L, j, B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1282 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1283 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1284 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1285 CXSPARSE_ZNAME (_pvec) (S->pinv, buf, vec + idx, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1286 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1287 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1288 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1289 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1290 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1291 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1292 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1293 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1294 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1295 return ComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1296 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1297 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1298 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1299 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1300 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1301 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1302 SparseComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1303 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::tall_solve<SparseMatrix, SparseComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1304 (const SparseMatrix& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1305 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1306 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1307 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1308 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1309 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1310 octave_idx_type nr = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1311 octave_idx_type nc = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1312 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1313 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1314 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1315 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1316 volatile octave_idx_type ii, x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1317 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1318 SparseComplexMatrix x (nc, b_nc, b.nnz ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1319 x.xcidx (0) = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1320 x_nz = b.nnz (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1321 ii = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1322 OCTAVE_LOCAL_BUFFER (Complex, Xx, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1323 OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1324 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1325 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1326 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1327 for (octave_idx_type j = 0; j < b_nr; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1328 Xx[j] = b.xelem (j,i); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1329 for (octave_idx_type j = nr; j < S->m2; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1330 buf[j] = cs_complex_t (0.0, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1331 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1332 CXSPARSE_ZNAME (_ipvec) (S->pinv, reinterpret_cast<cs_complex_t *>(Xx), buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1333 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1334 for (volatile octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1335 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1336 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1337 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1338 CXSPARSE_ZNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1339 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1340 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1341 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1342 CXSPARSE_ZNAME (_usolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1343 CXSPARSE_ZNAME (_ipvec) (S->q, buf, reinterpret_cast<cs_complex_t *>(Xx), nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1344 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1345 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1346 for (octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1347 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1348 Complex tmp = Xx[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1349 if (tmp != 0.0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1350 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1351 if (ii == x_nz) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1352 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1353 // Resize the sparse matrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1354 octave_idx_type sz = x_nz * (b_nc - i) / b_nc; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1355 sz = (sz > 10 ? sz : 10) + x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1356 x.change_capacity (sz); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1357 x_nz = sz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1358 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1359 x.xdata (ii) = tmp; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1360 x.xridx (ii++) = j; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1361 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1362 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1363 x.xcidx (i+1) = ii; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1364 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1365 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1366 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1367 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1368 x.maybe_compress (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1369 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1370 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1371 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1372 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1373 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1374 return SparseComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1375 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1376 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1377 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1378 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1379 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1380 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1381 SparseComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1382 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::wide_solve<SparseMatrix, SparseComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1383 (const SparseMatrix& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1384 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1385 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1386 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1387 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1388 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1389 // These are swapped because the original matrix was transposed in |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1390 // sparse_qr<SparseComplexMatrix>::solve. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1391 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1392 octave_idx_type nr = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1393 octave_idx_type nc = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1394 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1395 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1396 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1397 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1398 volatile octave_idx_type ii, x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1399 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1400 SparseComplexMatrix x (nc, b_nc, b.nnz ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1401 x.xcidx (0) = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1402 x_nz = b.nnz (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1403 ii = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1404 volatile octave_idx_type nbuf = (nc > S->m2 ? nc : S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1405 OCTAVE_LOCAL_BUFFER (Complex, Xx, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1406 OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, nbuf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1407 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1408 OCTAVE_LOCAL_BUFFER (double, B, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1409 for (octave_idx_type i = 0; i < nr; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1410 B[i] = N->B[i]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1411 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1412 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1413 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1414 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1415 for (octave_idx_type j = 0; j < b_nr; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1416 Xx[j] = b.xelem (j,i); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1417 for (octave_idx_type j = nr; j < nbuf; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1418 buf[j] = cs_complex_t (0.0, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1419 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1420 CXSPARSE_ZNAME (_pvec) (S->q, reinterpret_cast<cs_complex_t *>(Xx), buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1421 CXSPARSE_ZNAME (_utsolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1422 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1423 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1424 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1425 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1426 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1427 CXSPARSE_ZNAME (_happly) (N->L, j, B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1428 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1429 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1430 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1431 CXSPARSE_ZNAME (_pvec) (S->pinv, buf, reinterpret_cast<cs_complex_t *>(Xx), nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1432 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1433 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1434 for (octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1435 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1436 Complex tmp = Xx[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1437 if (tmp != 0.0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1438 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1439 if (ii == x_nz) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1440 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1441 // Resize the sparse matrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1442 octave_idx_type sz = x_nz * (b_nc - i) / b_nc; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1443 sz = (sz > 10 ? sz : 10) + x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1444 x.change_capacity (sz); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1445 x_nz = sz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1446 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1447 x.xdata (ii) = tmp; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1448 x.xridx (ii++) = j; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1449 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1450 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1451 x.xcidx (i+1) = ii; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1452 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1453 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1454 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1455 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1456 x.maybe_compress (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1457 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1458 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1459 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1460 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1461 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1462 return SparseComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1463 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1464 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1465 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1466 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1467 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1468 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1469 ComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1470 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::tall_solve<MArray<Complex>, ComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1471 (const MArray<Complex>& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1472 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1473 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1474 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1475 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1476 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1477 octave_idx_type nr = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1478 octave_idx_type nc = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1479 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1480 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1481 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1482 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1483 const cs_complex_t *bvec = reinterpret_cast<const cs_complex_t *>(b.fortran_vec ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1484 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1485 ComplexMatrix x (nc, b_nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1486 cs_complex_t *vec = reinterpret_cast<cs_complex_t *> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1487 (x.fortran_vec ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1488 OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1489 for (volatile octave_idx_type i = 0, idx = 0, bidx = 0; i < b_nc; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1490 i++, idx+=nc, bidx+=b_nr) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1491 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1492 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1493 for (octave_idx_type j = nr; j < S->m2; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1494 buf[j] = cs_complex_t (0.0, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1495 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1496 CXSPARSE_ZNAME (_ipvec) (S->pinv, bvec + bidx, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1497 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1498 for (volatile octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1499 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1500 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1501 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1502 CXSPARSE_ZNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1503 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1504 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1505 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1506 CXSPARSE_ZNAME (_usolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1507 CXSPARSE_ZNAME (_ipvec) (S->q, buf, vec + idx, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1508 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1509 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1510 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1511 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1512 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1513 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1514 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1515 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1516 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1517 return ComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1518 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1519 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1520 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1521 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1522 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1523 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1524 ComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1525 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::wide_solve<MArray<Complex>, ComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1526 (const MArray<Complex>& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1527 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1528 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1529 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1530 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1531 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1532 // These are swapped because the original matrix was transposed in |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1533 // sparse_qr<SparseComplexMatrix>::solve. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1534 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1535 octave_idx_type nr = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1536 octave_idx_type nc = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1537 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1538 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1539 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1540 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1541 const cs_complex_t *bvec = reinterpret_cast<const cs_complex_t *>(b.fortran_vec ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1542 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1543 ComplexMatrix x (nc, b_nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1544 cs_complex_t *vec = reinterpret_cast<cs_complex_t *> (x.fortran_vec ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1545 volatile octave_idx_type nbuf = (nc > S->m2 ? nc : S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1546 OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, nbuf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1547 OCTAVE_LOCAL_BUFFER (double, B, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1548 for (octave_idx_type i = 0; i < nr; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1549 B[i] = N->B[i]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1550 for (volatile octave_idx_type i = 0, idx = 0, bidx = 0; i < b_nc; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1551 i++, idx+=nc, bidx+=b_nr) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1552 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1553 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1554 for (octave_idx_type j = nr; j < nbuf; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1555 buf[j] = cs_complex_t (0.0, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1556 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1557 CXSPARSE_ZNAME (_pvec) (S->q, bvec + bidx, buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1558 CXSPARSE_ZNAME (_utsolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1559 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1560 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1561 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1562 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1563 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1564 CXSPARSE_ZNAME (_happly) (N->L, j, B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1565 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1566 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1567 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1568 CXSPARSE_ZNAME (_pvec) (S->pinv, buf, vec + idx, nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1569 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1570 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1571 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1572 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1573 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1574 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1575 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1576 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1577 return ComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1578 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1579 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1580 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1581 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1582 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1583 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1584 SparseComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1585 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::tall_solve<SparseComplexMatrix, SparseComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1586 (const SparseComplexMatrix& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1587 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1588 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1589 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1590 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1591 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1592 octave_idx_type nr = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1593 octave_idx_type nc = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1594 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1595 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1596 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1597 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1598 volatile octave_idx_type ii, x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1599 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1600 SparseComplexMatrix x (nc, b_nc, b.nnz ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1601 x.xcidx (0) = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1602 x_nz = b.nnz (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1603 ii = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1604 OCTAVE_LOCAL_BUFFER (Complex, Xx, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1605 OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1606 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1607 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1608 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1609 for (octave_idx_type j = 0; j < b_nr; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1610 Xx[j] = b.xelem (j,i); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1611 for (octave_idx_type j = nr; j < S->m2; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1612 buf[j] = cs_complex_t (0.0, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1613 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1614 CXSPARSE_ZNAME (_ipvec) (S->pinv, reinterpret_cast<cs_complex_t *>(Xx), buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1615 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1616 for (volatile octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1617 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1618 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1619 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1620 CXSPARSE_ZNAME (_happly) (N->L, j, N->B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1621 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1622 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1623 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1624 CXSPARSE_ZNAME (_usolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1625 CXSPARSE_ZNAME (_ipvec) (S->q, buf, reinterpret_cast<cs_complex_t *>(Xx), nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1626 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1627 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1628 for (octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1629 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1630 Complex tmp = Xx[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1631 if (tmp != 0.0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1632 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1633 if (ii == x_nz) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1634 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1635 // Resize the sparse matrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1636 octave_idx_type sz = x_nz * (b_nc - i) / b_nc; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1637 sz = (sz > 10 ? sz : 10) + x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1638 x.change_capacity (sz); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1639 x_nz = sz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1640 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1641 x.xdata (ii) = tmp; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1642 x.xridx (ii++) = j; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1643 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1644 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1645 x.xcidx (i+1) = ii; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1646 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1647 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1648 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1649 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1650 x.maybe_compress (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1651 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1652 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1653 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1654 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1655 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1656 return SparseComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1657 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1658 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1659 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1660 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1661 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1662 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1663 SparseComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1664 sparse_qr<SparseComplexMatrix>::sparse_qr_rep::wide_solve<SparseComplexMatrix, SparseComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1665 (const SparseComplexMatrix& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1666 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1667 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1668 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1669 #ifdef HAVE_CXSPARSE |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1670 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1671 // These are swapped because the original matrix was transposed in |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1672 // sparse_qr<SparseComplexMatrix>::solve. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1673 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1674 octave_idx_type nr = ncols; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1675 octave_idx_type nc = nrows; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1676 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1677 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1678 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1679 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1680 volatile octave_idx_type ii, x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1681 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1682 SparseComplexMatrix x (nc, b_nc, b.nnz ()); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1683 x.xcidx (0) = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1684 x_nz = b.nnz (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1685 ii = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1686 volatile octave_idx_type nbuf = (nc > S->m2 ? nc : S->m2); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1687 OCTAVE_LOCAL_BUFFER (Complex, Xx, (b_nr > nc ? b_nr : nc)); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1688 OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, nbuf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1689 OCTAVE_LOCAL_BUFFER (double, B, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1690 for (octave_idx_type i = 0; i < nr; i++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1691 B[i] = N->B[i]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1692 for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1693 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1694 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1695 for (octave_idx_type j = 0; j < b_nr; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1696 Xx[j] = b.xelem (j,i); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1697 for (octave_idx_type j = nr; j < nbuf; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1698 buf[j] = cs_complex_t (0.0, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1699 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1700 CXSPARSE_ZNAME (_pvec) (S->q, reinterpret_cast<cs_complex_t *>(Xx), buf, nr); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1701 CXSPARSE_ZNAME (_utsolve) (N->U, buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1702 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1703 for (volatile octave_idx_type j = nr-1; j >= 0; j--) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1704 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1705 octave_quit (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1706 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1707 CXSPARSE_ZNAME (_happly) (N->L, j, B[j], buf); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1708 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1709 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1710 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1711 CXSPARSE_ZNAME (_pvec) (S->pinv, buf, reinterpret_cast<cs_complex_t *>(Xx), nc); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1712 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1713 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1714 for (octave_idx_type j = 0; j < nc; j++) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1715 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1716 Complex tmp = Xx[j]; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1717 if (tmp != 0.0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1718 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1719 if (ii == x_nz) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1720 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1721 // Resize the sparse matrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1722 octave_idx_type sz = x_nz * (b_nc - i) / b_nc; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1723 sz = (sz > 10 ? sz : 10) + x_nz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1724 x.change_capacity (sz); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1725 x_nz = sz; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1726 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1727 x.xdata (ii) = tmp; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1728 x.xridx (ii++) = j; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1729 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1730 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1731 x.xcidx (i+1) = ii; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1732 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1733 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1734 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1735 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1736 x.maybe_compress (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1737 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1738 return x; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1739 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1740 #else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1741 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1742 return SparseComplexMatrix (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1743 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1744 #endif |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1745 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1746 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1747 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1748 sparse_qr<SPARSE_T>::sparse_qr (void) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1749 : rep (new sparse_qr_rep (SPARSE_T (), 0)) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1750 { } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1751 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1752 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1753 sparse_qr<SPARSE_T>::sparse_qr (const SPARSE_T& a, int order) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1754 : rep (new sparse_qr_rep (a, order)) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1755 { } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1756 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1757 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1758 sparse_qr<SPARSE_T>::sparse_qr (const sparse_qr<SPARSE_T>& a) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1759 : rep (a.rep) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1760 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1761 rep->count++; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1762 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1763 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1764 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1765 sparse_qr<SPARSE_T>::~sparse_qr (void) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1766 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1767 if (--rep->count == 0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1768 delete rep; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1769 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1770 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1771 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1772 sparse_qr<SPARSE_T>& |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1773 sparse_qr<SPARSE_T>::operator = (const sparse_qr<SPARSE_T>& a) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1774 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1775 if (this != &a) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1776 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1777 if (--rep->count == 0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1778 delete rep; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1779 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1780 rep = a.rep; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1781 rep->count++; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1782 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1783 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1784 return *this; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1785 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1786 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1787 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1788 bool |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1789 sparse_qr<SPARSE_T>::ok (void) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1790 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1791 return rep->ok (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1792 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1793 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1794 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1795 SPARSE_T |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1796 sparse_qr<SPARSE_T>::V (void) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1797 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1798 return rep->V (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1799 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1800 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1801 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1802 ColumnVector |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1803 sparse_qr<SPARSE_T>::Pinv (void) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1804 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1805 return rep->P (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1806 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1807 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1808 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1809 ColumnVector |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1810 sparse_qr<SPARSE_T>::P (void) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1811 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1812 return rep->P (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1813 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1814 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1815 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1816 SPARSE_T |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1817 sparse_qr<SPARSE_T>::R (bool econ) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1818 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1819 return rep->R (econ); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1820 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1821 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1822 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1823 typename SPARSE_T::dense_matrix_type |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1824 sparse_qr<SPARSE_T>::C (const typename SPARSE_T::dense_matrix_type& b) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1825 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1826 return rep->C (b); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1827 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1828 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1829 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1830 typename SPARSE_T::dense_matrix_type |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1831 sparse_qr<SPARSE_T>::Q (void) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1832 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1833 return rep->Q (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1834 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1835 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1836 // FIXME: Why is the "order" of the QR calculation as used in the |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1837 // CXSparse function sqr 3 for real matrices and 2 for complex? These |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1838 // values seem to be required but there was no explanation in David |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1839 // Bateman's original code. |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1840 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1841 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1842 class |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1843 cxsparse_defaults |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1844 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1845 public: |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1846 enum { order = -1 }; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1847 }; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1848 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1849 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1850 class |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1851 cxsparse_defaults<SparseMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1852 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1853 public: |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1854 enum { order = 3 }; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1855 }; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1856 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1857 template <> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1858 class |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1859 cxsparse_defaults<SparseComplexMatrix> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1860 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1861 public: |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1862 enum { order = 2 }; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1863 }; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1864 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1865 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1866 template <typename RHS_T, typename RET_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1867 RET_T |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1868 sparse_qr<SPARSE_T>::solve (const SPARSE_T& a, const RHS_T& b, |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1869 octave_idx_type& info) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1870 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1871 info = -1; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1872 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1873 octave_idx_type nr = a.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1874 octave_idx_type nc = a.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1875 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1876 octave_idx_type b_nc = b.cols (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1877 octave_idx_type b_nr = b.rows (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1878 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1879 int order = cxsparse_defaults<SPARSE_T>::order; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1880 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1881 if (nr < 0 || nc < 0 || nr != b_nr) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1882 (*current_liboctave_error_handler) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1883 ("matrix dimension mismatch in solution of minimum norm problem"); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1884 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1885 if (nr == 0 || nc == 0 || b_nc == 0) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1886 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1887 info = 0; |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1888 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1889 return RET_T (nc, b_nc, 0.0); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1890 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1891 else if (nr >= nc) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1892 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1893 sparse_qr<SPARSE_T> q (a, order); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1894 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1895 return q.ok () ? q.tall_solve<RHS_T, RET_T> (b, info) : RET_T (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1896 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1897 else |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1898 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1899 sparse_qr<SPARSE_T> q (a.hermitian (), order); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1900 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1901 return q.ok () ? q.wide_solve<RHS_T, RET_T> (b, info) : RET_T (); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1902 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1903 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1904 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1905 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1906 template <typename RHS_T, typename RET_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1907 RET_T |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1908 sparse_qr<SPARSE_T>::tall_solve (const RHS_T& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1909 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1910 return rep->tall_solve<RHS_T, RET_T> (b, info); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1911 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1912 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1913 template <typename SPARSE_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1914 template <typename RHS_T, typename RET_T> |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1915 RET_T |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1916 sparse_qr<SPARSE_T>::wide_solve (const RHS_T& b, octave_idx_type& info) const |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1917 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1918 return rep->wide_solve<RHS_T, RET_T> (b, info); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1919 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1920 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1921 Matrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1922 qrsolve (const SparseMatrix& a, const MArray<double>& b, |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1923 octave_idx_type& info) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1924 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1925 return sparse_qr<SparseMatrix>::solve<MArray<double>, Matrix> (a, b, info); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1926 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1927 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1928 SparseMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1929 qrsolve (const SparseMatrix& a, const SparseMatrix& b, |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1930 octave_idx_type& info) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1931 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1932 return sparse_qr<SparseMatrix>::solve<SparseMatrix, SparseMatrix> (a, b, info); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1933 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1934 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1935 ComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1936 qrsolve (const SparseMatrix& a, const MArray<Complex>& b, |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1937 octave_idx_type& info) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1938 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1939 return sparse_qr<SparseMatrix>::solve<MArray<Complex>, ComplexMatrix> (a, b, info); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1940 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1941 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1942 SparseComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1943 qrsolve (const SparseMatrix& a, const SparseComplexMatrix& b, |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1944 octave_idx_type& info) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1945 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1946 return sparse_qr<SparseMatrix>::solve<SparseComplexMatrix, SparseComplexMatrix> (a, b, info); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1947 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1948 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1949 ComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1950 qrsolve (const SparseComplexMatrix& a, const MArray<double>& b, |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1951 octave_idx_type& info) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1952 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1953 return sparse_qr<SparseComplexMatrix>::solve<MArray<double>, ComplexMatrix> (a, b, info); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1954 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1955 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1956 SparseComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1957 qrsolve (const SparseComplexMatrix& a, const SparseMatrix& b, |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1958 octave_idx_type& info) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1959 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1960 return sparse_qr<SparseComplexMatrix>::solve<SparseMatrix, SparseComplexMatrix> (a, b, info); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1961 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1962 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1963 ComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1964 qrsolve (const SparseComplexMatrix& a, const MArray<Complex>& b, |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1965 octave_idx_type& info) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1966 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1967 return sparse_qr<SparseComplexMatrix>::solve<MArray<Complex>, ComplexMatrix> (a, b, info); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1968 } |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1969 |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1970 SparseComplexMatrix |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1971 qrsolve (const SparseComplexMatrix& a, const SparseComplexMatrix& b, |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1972 octave_idx_type& info) |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1973 { |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1974 return sparse_qr<SparseComplexMatrix>::solve<SparseComplexMatrix, SparseComplexMatrix> (a, b, info); |
791dcb32b657
revamp sparse QR factorizatino classes
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
1975 } |