Mercurial > hg > octave-thorsten
changeset 12030:20a9a8180e33 release-3-2-x
fix sparse +- diag operations
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Thu, 02 Jul 2009 08:21:50 +0200 |
parents | ee264f77eaed |
children | 3335e82622ba |
files | liboctave/ChangeLog liboctave/Sparse-diag-op-defs.h |
diffstat | 2 files changed, 36 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,8 @@ +2009-07-02 Jaroslav Hajek <highegg@gmail.com> + + * Sparse-diag-op-defs.h (inner_do_add_sm_dm): Rewrite to ensure + ordering of row indices. + 2009-06-26 Michael Goffioul <michael.goffioul@gmail.com> * pathsearch.h (class dir_path::static_members): Decorate with
--- a/liboctave/Sparse-diag-op-defs.h +++ b/liboctave/Sparse-diag-op-defs.h @@ -134,26 +134,38 @@ { OCTAVE_QUIT; const octave_idx_type colend = a.cidx (j+1); - bool found_diag = false; r.xcidx (j) = k; - for (octave_idx_type k_src = a.cidx (j); k_src < colend; ++k_src, ++k) - { - const octave_idx_type i = a.ridx (k_src); - r.xridx (k) = i; - if (i != j) - r.xdata (k) = opa (a.data (k_src)); - else - { - r.xdata (k) = opa (a.data (k_src)) + opd (d.dgelem (j)); - found_diag = true; - } - } - if (!found_diag) - { - r.xridx (k) = j; - r.xdata (k) = opd (d.dgelem (j)); - ++k; - } + octave_idx_type k_src = a.cidx (j), k_split; + + for (k_split = k_src; k_split < colend; k_split++) + if (a.ridx (k_split) >= j) + break; + + for (; k_src < k_split; k_src++, k++) + { + r.xridx (k) = a.ridx (k_src); + r.xdata (k) = opa (a.data (k_src)); + } + + if (k_src < colend && a.ridx (k_src) == j) + { + r.xridx (k) = j; + r.xdata (k) = opa (a.data (k_src)) + opd (d.dgelem (j)); + k++; k_src++; + } + else + { + r.xridx (k) = j; + r.xdata (k) = opd (d.dgelem (j)); + k++; + } + + for (; k_src < colend; k_src++, k++) + { + r.xridx (k) = a.ridx (k_src); + r.xdata (k) = opa (a.data (k_src)); + } + } r.xcidx (nc) = k;