Mercurial > octave-nkf
comparison src/DLD-FUNCTIONS/luinc.cc @ 7515:f3c00dc0912b
Eliminate the rest of the dispatched sparse functions
author | David Bateman <dbateman@free.fr> |
---|---|
date | Fri, 22 Feb 2008 15:50:51 +0100 |
parents | e8d7eed42935 |
children | 6f2d95255911 |
comparison
equal
deleted
inserted
replaced
7514:4f6a73fd8df9 | 7515:f3c00dc0912b |
---|---|
88 range are ignored.\n\ | 88 range are ignored.\n\ |
89 @end table\n\ | 89 @end table\n\ |
90 \n\ | 90 \n\ |
91 All other fields in @var{opts} are ignored. The outputs from @dfn{luinc}\n\ | 91 All other fields in @var{opts} are ignored. The outputs from @dfn{luinc}\n\ |
92 are the same as for @dfn{lu}.\n\ | 92 are the same as for @dfn{lu}.\n\ |
93 \n\ | |
94 Given the string argument 'vector', @dfn{luinc} returns the values of @var{p}\n\ | |
95 @var{q} as vector values.\n\ | |
93 @seealso{sparse, lu, cholinc}\n\ | 96 @seealso{sparse, lu, cholinc}\n\ |
94 @end deftypefn") | 97 @end deftypefn") |
95 { | 98 { |
96 int nargin = args.length (); | 99 int nargin = args.length (); |
97 octave_value_list retval; | 100 octave_value_list retval; |
98 | 101 |
99 if (nargin == 0) | 102 if (nargin == 0) |
100 print_usage (); | 103 print_usage (); |
101 else if (nargin != 2) | 104 else if (nargin < 2 || nargin > 3) |
102 error ("luinc: incorrect number of arguments"); | 105 error ("luinc: incorrect number of arguments"); |
103 else | 106 else |
104 { | 107 { |
105 bool zero_level = false; | 108 bool zero_level = false; |
106 bool milu = false; | 109 bool milu = false; |
107 bool udiag = false; | 110 bool udiag = false; |
108 bool thresh = -1; | 111 Matrix thresh; |
109 double droptol = -1.; | 112 double droptol = -1.; |
113 bool vecout; | |
110 | 114 |
111 if (args(1).is_string ()) | 115 if (args(1).is_string ()) |
112 { | 116 { |
113 if (args(1).string_value () == "0") | 117 if (args(1).string_value () == "0") |
114 zero_level = true; | 118 zero_level = true; |
135 | 139 |
136 udiag = (tmp == 0. ? false : true); | 140 udiag = (tmp == 0. ? false : true); |
137 } | 141 } |
138 | 142 |
139 if (map.contains ("thresh")) | 143 if (map.contains ("thresh")) |
140 thresh = map.contents ("thresh")(0).double_value (); | 144 { |
145 thresh = map.contents ("thresh")(0).matrix_value (); | |
146 | |
147 if (thresh.nelem () == 1) | |
148 { | |
149 thresh.resize(1,2); | |
150 thresh(1) = thresh(0); | |
151 } | |
152 else if (thresh.nelem () != 2) | |
153 error ("chol: expecting 2 element vector for thresh"); | |
154 } | |
141 } | 155 } |
142 else | 156 else |
143 droptol = args(1).double_value (); | 157 droptol = args(1).double_value (); |
158 | |
159 if (nargin == 3) | |
160 { | |
161 std::string tmp = args(2).string_value (); | |
162 | |
163 if (! error_state ) | |
164 { | |
165 if (tmp.compare ("vector") == 0) | |
166 vecout = true; | |
167 else | |
168 error ("luinc: unrecognized string argument"); | |
169 } | |
170 } | |
144 | 171 |
145 // FIXME Add code for zero-level factorization | 172 // FIXME Add code for zero-level factorization |
146 if (zero_level) | 173 if (zero_level) |
147 error ("luinc: zero-level factorization not implemented"); | 174 error ("luinc: zero-level factorization not implemented"); |
148 | 175 |
164 { | 191 { |
165 case 0: | 192 case 0: |
166 case 1: | 193 case 1: |
167 case 2: | 194 case 2: |
168 { | 195 { |
169 SparseLU fact (sm, Qinit, thresh, true, droptol, | 196 SparseLU fact (sm, Qinit, thresh, false, true, droptol, |
170 milu, udiag); | 197 milu, udiag); |
171 | 198 |
172 if (! error_state) | 199 if (! error_state) |
173 { | 200 { |
174 SparseMatrix P = fact.Pr (); | 201 SparseMatrix P = fact.Pr (); |
182 } | 209 } |
183 break; | 210 break; |
184 | 211 |
185 case 3: | 212 case 3: |
186 { | 213 { |
187 SparseLU fact (sm, Qinit, thresh, true, droptol, | 214 SparseLU fact (sm, Qinit, thresh, false, true, droptol, |
188 milu, udiag); | 215 milu, udiag); |
189 | 216 |
190 if (! error_state) | 217 if (! error_state) |
191 { | 218 { |
192 retval(2) = fact.Pr (); | 219 if (vecout) |
220 retval(2) = fact.Pr_vec (); | |
221 else | |
222 retval(2) = fact.Pr (); | |
193 retval(1) = octave_value (fact.U (), | 223 retval(1) = octave_value (fact.U (), |
194 MatrixType (MatrixType::Upper)); | 224 MatrixType (MatrixType::Upper)); |
195 retval(0) = octave_value (fact.L (), | 225 retval(0) = octave_value (fact.L (), |
196 MatrixType (MatrixType::Lower)); | 226 MatrixType (MatrixType::Lower)); |
197 } | 227 } |
199 break; | 229 break; |
200 | 230 |
201 case 4: | 231 case 4: |
202 default: | 232 default: |
203 { | 233 { |
204 SparseLU fact (sm, Qinit, thresh, false, droptol, | 234 SparseLU fact (sm, Qinit, thresh, false, false, droptol, |
205 milu, udiag); | 235 milu, udiag); |
206 | 236 |
207 if (! error_state) | 237 if (! error_state) |
208 { | 238 { |
209 retval(3) = fact.Pc (); | 239 if (vecout) |
210 retval(2) = fact.Pr (); | 240 { |
241 retval(3) = fact.Pc_vec (); | |
242 retval(2) = fact.Pr_vec (); | |
243 } | |
244 else | |
245 { | |
246 retval(3) = fact.Pc (); | |
247 retval(2) = fact.Pr (); | |
248 } | |
211 retval(1) = octave_value (fact.U (), | 249 retval(1) = octave_value (fact.U (), |
212 MatrixType (MatrixType::Upper)); | 250 MatrixType (MatrixType::Upper)); |
213 retval(0) = octave_value (fact.L (), | 251 retval(0) = octave_value (fact.L (), |
214 MatrixType (MatrixType::Lower)); | 252 MatrixType (MatrixType::Lower)); |
215 } | 253 } |
235 { | 273 { |
236 case 0: | 274 case 0: |
237 case 1: | 275 case 1: |
238 case 2: | 276 case 2: |
239 { | 277 { |
240 SparseComplexLU fact (sm, Qinit, thresh, true, | 278 SparseComplexLU fact (sm, Qinit, thresh, false, true, |
241 droptol, milu, udiag); | 279 droptol, milu, udiag); |
242 | 280 |
243 | 281 |
244 if (! error_state) | 282 if (! error_state) |
245 { | 283 { |
254 } | 292 } |
255 break; | 293 break; |
256 | 294 |
257 case 3: | 295 case 3: |
258 { | 296 { |
259 SparseComplexLU fact (sm, Qinit, thresh, true, | 297 SparseComplexLU fact (sm, Qinit, thresh, false, true, |
260 droptol, milu, udiag); | 298 droptol, milu, udiag); |
261 | 299 |
262 if (! error_state) | 300 if (! error_state) |
263 { | 301 { |
264 retval(2) = fact.Pr (); | 302 if (vecout) |
303 retval(2) = fact.Pr_vec (); | |
304 else | |
305 retval(2) = fact.Pr (); | |
265 retval(1) = octave_value (fact.U (), | 306 retval(1) = octave_value (fact.U (), |
266 MatrixType (MatrixType::Upper)); | 307 MatrixType (MatrixType::Upper)); |
267 retval(0) = octave_value (fact.L (), | 308 retval(0) = octave_value (fact.L (), |
268 MatrixType (MatrixType::Lower)); | 309 MatrixType (MatrixType::Lower)); |
269 } | 310 } |
271 break; | 312 break; |
272 | 313 |
273 case 4: | 314 case 4: |
274 default: | 315 default: |
275 { | 316 { |
276 SparseComplexLU fact (sm, Qinit, thresh, false, | 317 SparseComplexLU fact (sm, Qinit, thresh, false, false, |
277 droptol, milu, udiag); | 318 droptol, milu, udiag); |
278 | 319 |
279 if (! error_state) | 320 if (! error_state) |
280 { | 321 { |
281 retval(3) = fact.Pc (); | 322 if (vecout) |
282 retval(2) = fact.Pr (); | 323 { |
324 retval(3) = fact.Pc_vec (); | |
325 retval(2) = fact.Pr_vec (); | |
326 } | |
327 else | |
328 { | |
329 retval(3) = fact.Pc (); | |
330 retval(2) = fact.Pr (); | |
331 } | |
283 retval(1) = octave_value (fact.U (), | 332 retval(1) = octave_value (fact.U (), |
284 MatrixType (MatrixType::Upper)); | 333 MatrixType (MatrixType::Upper)); |
285 retval(0) = octave_value (fact.L (), | 334 retval(0) = octave_value (fact.L (), |
286 MatrixType (MatrixType::Lower)); | 335 MatrixType (MatrixType::Lower)); |
287 } | 336 } |