Mercurial > hg > octave-nkf
diff liboctave/sparse-base-lu.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 | a1dbe9d80eee |
children | eb63fbe60fab |
line wrap: on
line diff
--- a/liboctave/sparse-base-lu.cc +++ b/liboctave/sparse-base-lu.cc @@ -28,9 +28,45 @@ #include "sparse-base-lu.h" template <class lu_type, class lu_elt_type, class p_type, class p_elt_type> +lu_type +sparse_base_lu <lu_type, lu_elt_type, p_type, p_elt_type> :: Y (void) const +{ + octave_idx_type nr = Lfact.rows (); + octave_idx_type nc = Ufact.rows (); + octave_idx_type rcmin = (nr > nc ? nr : nc); + + lu_type Yout (nr, nc, Lfact.nnz() + Ufact.nnz()); + octave_idx_type ii = 0; + Yout.xcidx(0) = 0; + + for (octave_idx_type j = 0; j < nc; j++) + { + for (octave_idx_type i = Ufact.cidx (j); i < Ufact.cidx(j + 1); i++) + { + Yout.xridx (ii) = Ufact.ridx(i); + Yout.xdata (ii++) = Ufact.data(i); + } + if (j < rcmin) + { + // Note the +1 skips the 1.0 on the diagonal + for (octave_idx_type i = Lfact.cidx (j) + 1; + i < Lfact.cidx(j +1); i++) + { + Yout.xridx (ii) = Lfact.ridx(i); + Yout.xdata (ii++) = Lfact.data(i); + } + } + Yout.xcidx(j + 1) = ii; + } + + return Yout; +} + +template <class lu_type, class lu_elt_type, class p_type, class p_elt_type> p_type sparse_base_lu <lu_type, lu_elt_type, p_type, p_elt_type> :: Pr (void) const { + octave_idx_type nr = Lfact.rows (); p_type Pout (nr, nr, nr); @@ -47,6 +83,21 @@ } template <class lu_type, class lu_elt_type, class p_type, class p_elt_type> +ColumnVector +sparse_base_lu <lu_type, lu_elt_type, p_type, p_elt_type> :: Pr_vec (void) const +{ + + octave_idx_type nr = Lfact.rows (); + + ColumnVector Pout (nr); + + for (octave_idx_type i = 0; i < nr; i++) + Pout.xelem (i) = static_cast<double> (P(i) + 1); + + return Pout; +} + +template <class lu_type, class lu_elt_type, class p_type, class p_elt_type> p_type sparse_base_lu <lu_type, lu_elt_type, p_type, p_elt_type> :: Pc (void) const { @@ -65,6 +116,21 @@ return Pout; } +template <class lu_type, class lu_elt_type, class p_type, class p_elt_type> +ColumnVector +sparse_base_lu <lu_type, lu_elt_type, p_type, p_elt_type> :: Pc_vec (void) const +{ + + octave_idx_type nr = Lfact.rows (); + + ColumnVector Pout (nr); + + for (octave_idx_type i = 0; i < nr; i++) + Pout.xelem (i) = static_cast<double> (Q(i) + 1); + + return Pout; +} + /* ;;; Local Variables: *** ;;; mode: C++ ***