diff liboctave/Sparse.h @ 7602:7bfaa9611558

Rewrite sparse mappers in terms of a functor template function
author David Bateman <dbateman@free.fr>
date Wed, 19 Mar 2008 10:38:33 -0400
parents ada435261879
children 36594d5bbe13
line wrap: on
line diff
--- a/liboctave/Sparse.h	Tue Mar 18 21:32:48 2008 -0400
+++ b/liboctave/Sparse.h	Wed Mar 19 10:38:33 2008 -0400
@@ -521,6 +521,61 @@
   Sparse<T> sort (octave_idx_type dim = 0, sortmode mode = ASCENDING) const;
   Sparse<T> sort (Array<octave_idx_type> &sidx, octave_idx_type dim = 0,
 		 sortmode mode = ASCENDING) const;
+
+  template <class U, class F>
+  Sparse<U>
+  map (F fcn) const
+  {
+    Sparse<U> result;
+    U f_zero = fcn (0.);
+
+    if (f_zero != 0.)
+      {
+	octave_idx_type nr = rows ();
+	octave_idx_type nc = cols ();
+      
+	result = Sparse<U> (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 = Sparse<U> (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++)
+	      {
+		U 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;
+  }
 };
 
 // NOTE: these functions should be friends of the Sparse<T> class and