# HG changeset patch # User Jaroslav Hajek # Date 1246515710 -7200 # Node ID 20a9a8180e334acbc4c5c5a052d4db599699d32b # Parent ee264f77eaed9731990eadcea8cc324f55c5e602 fix sparse +- diag operations diff -r ee264f77eaed -r 20a9a8180e33 liboctave/ChangeLog --- a/liboctave/ChangeLog Thu Jul 02 06:31:29 2009 +0200 +++ b/liboctave/ChangeLog Thu Jul 02 08:21:50 2009 +0200 @@ -1,3 +1,8 @@ +2009-07-02 Jaroslav Hajek + + * Sparse-diag-op-defs.h (inner_do_add_sm_dm): Rewrite to ensure + ordering of row indices. + 2009-06-26 Michael Goffioul * pathsearch.h (class dir_path::static_members): Decorate with diff -r ee264f77eaed -r 20a9a8180e33 liboctave/Sparse-diag-op-defs.h --- a/liboctave/Sparse-diag-op-defs.h Thu Jul 02 06:31:29 2009 +0200 +++ b/liboctave/Sparse-diag-op-defs.h Thu Jul 02 08:21:50 2009 +0200 @@ -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;