diff liboctave/CSparse.cc @ 7503:8c32f95c2639

convert mapper functions to new format
author David Bateman <dbateman@free.fr>
date Wed, 20 Feb 2008 04:22:50 -0500
parents 29980c6b8604
children f3c00dc0912b
line wrap: on
line diff
--- a/liboctave/CSparse.cc	Wed Feb 20 01:09:19 2008 -0500
+++ b/liboctave/CSparse.cc	Wed Feb 20 04:22:50 2008 -0500
@@ -7177,163 +7177,6 @@
 
 // other operations
 
-SparseComplexMatrix
-SparseComplexMatrix::map (c_c_Mapper f) const
-{
-  octave_idx_type nr = rows ();
-  octave_idx_type nc = cols ();
-  octave_idx_type nz = nnz ();
-  bool f_zero = (f(0.0) == 0.0);
-
-  // Count number of non-zero elements
-  octave_idx_type nel = (f_zero ? 0 : nr*nc - nz);
-  for (octave_idx_type i = 0; i < nz; i++)
-    if (f (data(i)) != 0.0)
-      nel++;
-
-  SparseComplexMatrix retval (nr, nc, nel);
-
-  if (f_zero)
-    {
-      octave_idx_type ii = 0;
-      for (octave_idx_type j = 0; j < nc; j++)
-	{
-	  for (octave_idx_type i = 0; i < nr; i++)
-	    {
-	      Complex tmp = f (elem (i, j));
-	      if (tmp != 0.0)
-		{
-		  retval.data(ii) = tmp;
-		  retval.ridx(ii++) = i;
-		}
-	    }
-	  retval.cidx(j+1) = ii;
-	}
-    }
-  else
-    {
-      octave_idx_type ii = 0;
-      for (octave_idx_type j = 0; j < nc; j++)
-	{
-	  for (octave_idx_type i = cidx(j); i < cidx(j+1); i++)
-	    {
-	      retval.data(ii) = f (elem(i));
-	      retval.ridx(ii++) = ridx(i);
-	    }
-	  retval.cidx(j+1) = ii;
-	}
-    }
-
-  return retval;
-}
-
-SparseMatrix
-SparseComplexMatrix::map (d_c_Mapper f) const
-{
-  octave_idx_type nr = rows ();
-  octave_idx_type nc = cols ();
-  octave_idx_type nz = nnz ();
-  bool f_zero = (f(0.0) == 0.0);
-
-  // Count number of non-zero elements
-  octave_idx_type nel = (f_zero ? 0 : nr*nc - nz);
-  for (octave_idx_type i = 0; i < nz; i++)
-    if (f (data(i)) != 0.0)
-      nel++;
-
-  SparseMatrix retval (nr, nc, nel);
-
-  if (f_zero)
-    {
-      octave_idx_type ii = 0;
-      for (octave_idx_type j = 0; j < nc; j++)
-	{
-	  for (octave_idx_type i = 0; i < nr; i++)
-	    {
-	      double tmp = f (elem (i, j));
-	      if (tmp != 0.0)
-		{
-		  retval.data(ii) = tmp;
-		  retval.ridx(ii++) = i;
-		}
-	    }
-	  retval.cidx(j+1) = ii;
-	}
-    }
-  else
-    {
-      octave_idx_type ii = 0;
-      for (octave_idx_type j = 0; j < nc; j++)
-	{
-	  for (octave_idx_type i = cidx(j); i < cidx(j+1); i++)
-	    {
-	      retval.data(ii) = f (elem(i));
-	      retval.ridx(ii++) = ridx(i);
-	    }
-	  retval.cidx(j+1) = ii;
-	}
-    }
-
-  return retval;
-}
-
-SparseBoolMatrix
-SparseComplexMatrix::map (b_c_Mapper f) const
-{
-  octave_idx_type nr = rows ();
-  octave_idx_type nc = cols ();
-  octave_idx_type nz = nnz ();
-  bool f_zero = f(0.0);
-
-  // Count number of non-zero elements
-  octave_idx_type nel = (f_zero ? 0 : nr*nc - nz);
-  for (octave_idx_type i = 0; i < nz; i++)
-    if (f (data(i)) != 0.0)
-      nel++;
-
-  SparseBoolMatrix retval (nr, nc, nel);
-
-  if (f_zero)
-    {
-      octave_idx_type ii = 0;
-      for (octave_idx_type j = 0; j < nc; j++)
-	{
-	  for (octave_idx_type i = 0; i < nr; i++)
-	    {
-	      bool tmp = f (elem (i, j));
-	      if (tmp)
-		{
-		  retval.data(ii) = tmp;
-		  retval.ridx(ii++) = i;
-		}
-	    }
-	  retval.cidx(j+1) = ii;
-	}
-    }
-  else
-    {
-      octave_idx_type ii = 0;
-      for (octave_idx_type j = 0; j < nc; j++)
-	{
-	  for (octave_idx_type i = cidx(j); i < cidx(j+1); i++)
-	    {
-	      retval.data(ii) = f (elem(i));
-	      retval.ridx(ii++) = ridx(i);
-	    }
-	  retval.cidx(j+1) = ii;
-	}
-    }
-
-  return retval;
-}
-
-SparseComplexMatrix&
-SparseComplexMatrix::apply (c_c_Mapper f)
-{
-  *this = map (f);
-  return *this;
-}
-
 bool
 SparseComplexMatrix::any_element_is_inf_or_nan (void) const
 {
@@ -7599,6 +7442,169 @@
   return d;
 }
 
+SparseMatrix
+SparseComplexMatrix::map (dmapper fcn) const
+{
+  SparseMatrix result;
+  double f_zero = fcn (0.);
+
+  if (f_zero != 0.)
+    {
+      octave_idx_type nr = rows ();
+      octave_idx_type nc = cols ();
+      
+      result = SparseMatrix (nr, nc, f_zero);
+
+      for (octave_idx_type j = 0; j < nc; j++)
+	for (octave_idx_type i = cidx(j); i < cidx (j+1); i++)
+	  {
+	    OCTAVE_QUIT;
+	    /* Use data instead of elem for better performance.  */
+	    result.data (ridx (i) + j * nr) = fcn (data(i));
+	  }
+
+      result.maybe_compress (true);
+    }
+  else
+    {
+      octave_idx_type nz = nnz ();
+      octave_idx_type nr = rows ();
+      octave_idx_type nc = cols ();
+
+      result = SparseMatrix (nr, nc, nz);
+      octave_idx_type ii = 0;
+      result.cidx (ii) = 0;
+
+      for (octave_idx_type j = 0; j < nc; j++)
+	{
+	  for (octave_idx_type i = cidx(j); i < cidx (j+1); i++)
+	    {
+	      double val = fcn (data (i));
+	      if (val != 0.0)
+		{
+		  result.data (ii) = val;
+		  result.ridx (ii++) = ridx (i);
+		}
+	      OCTAVE_QUIT;
+	    }
+	  result.cidx (j+1) = ii;
+	}
+
+      result.maybe_compress (false);
+    }
+
+  return result;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::map (cmapper fcn) const
+{
+  SparseComplexMatrix result;
+  Complex f_zero = fcn (0.);
+
+  if (f_zero != 0.)
+    {
+      octave_idx_type nr = rows ();
+      octave_idx_type nc = cols ();
+      
+      result = SparseComplexMatrix (nr, nc, f_zero);
+
+      for (octave_idx_type j = 0; j < nc; j++)
+	for (octave_idx_type i = cidx(j); i < cidx (j+1); i++)
+	  {
+	    OCTAVE_QUIT;
+	    /* Use data instead of elem for better performance.  */
+	    result.data (ridx (i) + j * nr) = fcn (data(i));
+	  }
+
+      result.maybe_compress (true);
+    }
+  else
+    {
+      octave_idx_type nz = nnz ();
+      octave_idx_type nr = rows ();
+      octave_idx_type nc = cols ();
+
+      result = SparseComplexMatrix (nr, nc, nz);
+      Complex zero = Complex (0.0, 0.0);
+      octave_idx_type ii = 0;
+      result.cidx (ii) = 0;
+
+      for (octave_idx_type j = 0; j < nc; j++)
+	{
+	  for (octave_idx_type i = cidx(j); i < cidx (j+1); i++)
+	    {
+	      Complex val = fcn (data (i));
+	      if (val != zero)
+		{
+		  result.data (ii) = val;
+		  result.ridx (ii++) = ridx (i);
+		}
+	      OCTAVE_QUIT;
+	    }
+	  result.cidx (j+1) = ii;
+	}
+
+      result.maybe_compress (false);
+    }
+
+  return result;
+}
+
+SparseBoolMatrix
+SparseComplexMatrix::map (bmapper fcn) const
+{
+  SparseBoolMatrix result;
+  bool f_zero = fcn (0.);
+
+  if (f_zero)
+    {
+      octave_idx_type nr = rows ();
+      octave_idx_type nc = cols ();
+      
+      result = SparseBoolMatrix (nr, nc, f_zero);
+
+      for (octave_idx_type j = 0; j < nc; j++)
+	for (octave_idx_type i = cidx(j); i < cidx (j+1); i++)
+	  {
+	    OCTAVE_QUIT;
+	    /* Use data instead of elem for better performance.  */
+	    result.data (ridx (i) + j * nr) = fcn (data(i));
+	  }
+
+      result.maybe_compress (true);
+    }
+  else
+    {
+      octave_idx_type nz = nnz ();
+      octave_idx_type nr = rows ();
+      octave_idx_type nc = cols ();
+
+      result = SparseBoolMatrix (nr, nc, nz);
+      octave_idx_type ii = 0;
+      result.cidx (ii) = 0;
+
+      for (octave_idx_type j = 0; j < nc; j++)
+	{
+	  for (octave_idx_type i = cidx(j); i < cidx (j+1); i++)
+	    {
+	      bool val = fcn (data (i));
+	      if (val)
+		{
+		  result.data (ii) = val;
+		  result.ridx (ii++) = ridx (i);
+		}
+	      OCTAVE_QUIT;
+	    }
+	  result.cidx (j+1) = ii;
+	}
+
+      result.maybe_compress (false);
+    }
+
+  return result;
+}
+
 std::ostream&
 operator << (std::ostream& os, const SparseComplexMatrix& a)
 {