diff liboctave/Sparse.cc @ 5760:8d7162924bd3

[project @ 2006-04-14 04:01:37 by jwe]
author jwe
date Fri, 14 Apr 2006 04:01:40 +0000
parents c7d5a534afa5
children 7ba9ad1fec11
line wrap: on
line diff
--- a/liboctave/Sparse.cc
+++ b/liboctave/Sparse.cc
@@ -2492,33 +2492,32 @@
 			    {
 			      octave_idx_type iii = 0;
 			      octave_idx_type ii = idx_i.elem (iii);
-			      for (octave_idx_type i = 0; i < new_nr; i++)
+			      octave_idx_type ppp = 0;
+			      octave_idx_type ppi = lhs.cidx(j+1) - 
+				lhs.cidx(j); 
+			      octave_idx_type pp = (ppp < ppi ? 
+						    lhs.ridx(lhs.cidx(j)+ppp) :
+						    new_nr);
+			      while (ppp < ppi || iii < n)
 				{
-				  OCTAVE_QUIT;
-
-				  if (iii < n && ii == i)
+				  if (iii < n && ii <= pp)
 				    {
 				      if (scalar != RT ())
 					{
 					  stmp.data(kk) = scalar;
-					  stmp.ridx(kk++) = i;
+					  stmp.ridx(kk++) = ii;
 					}
+				      if (ii == pp)
+					pp = (++ppp < ppi ? lhs.ridx(lhs.cidx(j)+ppp) : new_nr);					
 				      if (++iii < n)
 					ii = idx_i.elem(iii);
 				    }
-				  else if (j < lhs.cols()) 
+				  else
 				    {
-				      for (octave_idx_type k = lhs.cidx(j); 
-					   k < lhs.cidx(j+1); k++)
-					{
-					  if (lhs.ridx(k) == i)
-					    {
-					      stmp.data(kk) = lhs.data(k);
-					      stmp.ridx(kk++) = i;
-					    }
-					  if (lhs.ridx(k) >= i)
-					    break;
-					}
+				      stmp.data(kk) = 
+					lhs.data(lhs.cidx(j)+ppp);
+				      stmp.ridx(kk++) = pp;
+				      pp = (++ppp < ppi ? lhs.ridx(lhs.cidx(j)+ppp) : new_nr);
 				    }
 				}
 			      if (++jji < m)
@@ -2630,36 +2629,8 @@
 			for (octave_idx_type i = 0; i < m; i++)
 			  rhs_idx_j[i] = i;
 
-		      // Count the number of non-zero terms
-		      octave_idx_type new_nzmx = lhs.nnz ();
-		      for (octave_idx_type j = 0; j < m; j++)
-			{
-			  octave_idx_type jj = idx_j.elem (j);
-			  for (octave_idx_type i = 0; i < n; i++)
-			    {
-			      OCTAVE_QUIT;
-
-			      if (jj < lhs_nc)
-				{
-				  octave_idx_type ii = idx_i.elem (i);
-			      
-				  if (ii < lhs_nr)
-				    {
-				      for (octave_idx_type k = lhs.cidx(jj); 
-					   k < lhs.cidx(jj+1); k++)
-					{
-					  if (lhs.ridx(k) == ii)
-					    new_nzmx--;
-					  if (lhs.ridx(k) >= ii)
-					    break;
-					}
-				    }
-				}
-			      
-			      if (rhs.elem(rhs_idx_i[i],rhs_idx_j[j]) != RT ())
-				new_nzmx++;
-			    }
-			}
+		      // Maximum number of non-zero elements
+		      octave_idx_type new_nzmx = lhs.nnz() + rhs.nnz();
 
 		      Sparse<LT> stmp (new_nr, new_nc, new_nzmx);
 
@@ -2673,35 +2644,34 @@
 			    {
 			      octave_idx_type iii = 0;
 			      octave_idx_type ii = idx_i.elem (iii);
-			      for (octave_idx_type i = 0; i < new_nr; i++)
+			      octave_idx_type ppp = 0;
+			      octave_idx_type ppi = lhs.cidx(j+1) -
+				lhs.cidx(j);
+			      octave_idx_type pp = (ppp < ppi ? 
+						    lhs.ridx(lhs.cidx(j)+ppp) :
+						    new_nr);
+			      while (ppp < ppi || iii < n)
 				{
-				  OCTAVE_QUIT;
-
-				  if (iii < n && ii == i)
+				  if (iii < n && ii <= pp)
 				    {
 				      RT rtmp = rhs.elem (rhs_idx_i[iii], 
 							  rhs_idx_j[jji]);
 				      if (rtmp != RT ())
 					{
 					  stmp.data(kk) = rtmp;
-					  stmp.ridx(kk++) = i;
+					  stmp.ridx(kk++) = ii;
 					}
+				      if (ii == pp)
+					pp = (++ppp < ppi ? lhs.ridx(lhs.cidx(j)+ppp) : new_nr);					
 				      if (++iii < n)
 					ii = idx_i.elem(iii);
 				    }
-				  else if (j < lhs.cols()) 
+				  else
 				    {
-				      for (octave_idx_type k = lhs.cidx(j); 
-					   k < lhs.cidx(j+1); k++)
-					{
-					  if (lhs.ridx(k) == i)
-					    {
-					      stmp.data(kk) = lhs.data(k);
-					      stmp.ridx(kk++) = i;
-					    }
-					  if (lhs.ridx(k) >= i)
-					    break;
-					}
+				      stmp.data(kk) = 
+					lhs.data(lhs.cidx(j)+ppp);
+				      stmp.ridx(kk++) = pp;
+				      pp = (++ppp < ppi ? lhs.ridx(lhs.cidx(j)+ppp) : new_nr);
 				    }
 				}
 			      if (++jji < m)
@@ -2719,6 +2689,7 @@
 			  stmp.cidx(j+1) = kk;
 			}
 
+		      stmp.maybe_compress();
 		      lhs = stmp;
 		    }
 		}
@@ -2788,7 +2759,7 @@
 			}
 		    }
 
-		  if (! assign1 ((Sparse<LT>&) lhs, (Sparse<RT>&) rhs))
+		  if (! assign1 (lhs, rhs))
 		    retval = 0;
 		}
 	    }
@@ -2802,7 +2773,7 @@
 	    {
 	      if (rhs_nr == 0 && rhs_nc == 0)
 		lhs.maybe_delete_elements (idx_i);
-	      else if (! assign1 ((Sparse<LT>&) lhs, (Sparse<RT>&) rhs))
+	      else if (! assign1 (lhs, rhs))
 		retval = 0;
 	    }
 	  // idx_vector::freeze() printed an error message for us.
@@ -2815,7 +2786,7 @@
 	    {
 	      if (rhs_nr == 0 && rhs_nc == 0)
 		lhs.maybe_delete_elements (idx_i);
-	      else if (! assign1 ((Sparse<LT>&) lhs, (Sparse<RT>&) rhs))
+	      else if (! assign1 (lhs, rhs))
 		retval = 0;
 	    }
 	  // idx_vector::freeze() printed an error message for us.