Mercurial > hg > octave-nkf
diff 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 |
line wrap: on
line diff
--- a/src/DLD-FUNCTIONS/luinc.cc +++ b/src/DLD-FUNCTIONS/luinc.cc @@ -90,6 +90,9 @@ \n\ All other fields in @var{opts} are ignored. The outputs from @dfn{luinc}\n\ are the same as for @dfn{lu}.\n\ +\n\ +Given the string argument 'vector', @dfn{luinc} returns the values of @var{p}\n\ +@var{q} as vector values.\n\ @seealso{sparse, lu, cholinc}\n\ @end deftypefn") { @@ -98,15 +101,16 @@ if (nargin == 0) print_usage (); - else if (nargin != 2) + else if (nargin < 2 || nargin > 3) error ("luinc: incorrect number of arguments"); else { bool zero_level = false; bool milu = false; bool udiag = false; - bool thresh = -1; + Matrix thresh; double droptol = -1.; + bool vecout; if (args(1).is_string ()) { @@ -137,11 +141,34 @@ } if (map.contains ("thresh")) - thresh = map.contents ("thresh")(0).double_value (); + { + thresh = map.contents ("thresh")(0).matrix_value (); + + if (thresh.nelem () == 1) + { + thresh.resize(1,2); + thresh(1) = thresh(0); + } + else if (thresh.nelem () != 2) + error ("chol: expecting 2 element vector for thresh"); + } } else droptol = args(1).double_value (); + if (nargin == 3) + { + std::string tmp = args(2).string_value (); + + if (! error_state ) + { + if (tmp.compare ("vector") == 0) + vecout = true; + else + error ("luinc: unrecognized string argument"); + } + } + // FIXME Add code for zero-level factorization if (zero_level) error ("luinc: zero-level factorization not implemented"); @@ -166,7 +193,7 @@ case 1: case 2: { - SparseLU fact (sm, Qinit, thresh, true, droptol, + SparseLU fact (sm, Qinit, thresh, false, true, droptol, milu, udiag); if (! error_state) @@ -184,12 +211,15 @@ case 3: { - SparseLU fact (sm, Qinit, thresh, true, droptol, + SparseLU fact (sm, Qinit, thresh, false, true, droptol, milu, udiag); if (! error_state) { - retval(2) = fact.Pr (); + if (vecout) + retval(2) = fact.Pr_vec (); + else + retval(2) = fact.Pr (); retval(1) = octave_value (fact.U (), MatrixType (MatrixType::Upper)); retval(0) = octave_value (fact.L (), @@ -201,13 +231,21 @@ case 4: default: { - SparseLU fact (sm, Qinit, thresh, false, droptol, + SparseLU fact (sm, Qinit, thresh, false, false, droptol, milu, udiag); if (! error_state) { - retval(3) = fact.Pc (); - retval(2) = fact.Pr (); + if (vecout) + { + retval(3) = fact.Pc_vec (); + retval(2) = fact.Pr_vec (); + } + else + { + retval(3) = fact.Pc (); + retval(2) = fact.Pr (); + } retval(1) = octave_value (fact.U (), MatrixType (MatrixType::Upper)); retval(0) = octave_value (fact.L (), @@ -237,7 +275,7 @@ case 1: case 2: { - SparseComplexLU fact (sm, Qinit, thresh, true, + SparseComplexLU fact (sm, Qinit, thresh, false, true, droptol, milu, udiag); @@ -256,12 +294,15 @@ case 3: { - SparseComplexLU fact (sm, Qinit, thresh, true, + SparseComplexLU fact (sm, Qinit, thresh, false, true, droptol, milu, udiag); if (! error_state) { - retval(2) = fact.Pr (); + if (vecout) + retval(2) = fact.Pr_vec (); + else + retval(2) = fact.Pr (); retval(1) = octave_value (fact.U (), MatrixType (MatrixType::Upper)); retval(0) = octave_value (fact.L (), @@ -273,13 +314,21 @@ case 4: default: { - SparseComplexLU fact (sm, Qinit, thresh, false, + SparseComplexLU fact (sm, Qinit, thresh, false, false, droptol, milu, udiag); if (! error_state) { - retval(3) = fact.Pc (); - retval(2) = fact.Pr (); + if (vecout) + { + retval(3) = fact.Pc_vec (); + retval(2) = fact.Pr_vec (); + } + else + { + retval(3) = fact.Pc (); + retval(2) = fact.Pr (); + } retval(1) = octave_value (fact.U (), MatrixType (MatrixType::Upper)); retval(0) = octave_value (fact.L (),