diff liboctave/boolSparse.cc @ 7515:f3c00dc0912b

Eliminate the rest of the dispatched sparse functions
author David Bateman <dbateman@free.fr>
date Fri, 22 Feb 2008 15:50:51 +0100
parents a1dbe9d80eee
children 36594d5bbe13
line wrap: on
line diff
--- a/liboctave/boolSparse.cc
+++ b/liboctave/boolSparse.cc
@@ -140,6 +140,93 @@
   SPARSE_ANY_OP (dim);
 }
 
+SparseBoolMatrix
+SparseBoolMatrix::diag (octave_idx_type k) const
+{
+  octave_idx_type nnr = rows ();
+  octave_idx_type nnc = cols ();
+
+  if (k > 0)
+    nnc -= k;
+  else if (k < 0)
+    nnr += k;
+
+  SparseBoolMatrix d;
+
+  if (nnr > 0 && nnc > 0)
+    {
+      octave_idx_type ndiag = (nnr < nnc) ? nnr : nnc;
+
+      // Count the number of non-zero elements
+      octave_idx_type nel = 0;
+      if (k > 0)
+	{
+	  for (octave_idx_type i = 0; i < ndiag; i++)
+	    if (elem (i, i+k) != 0.)
+	      nel++;
+	}
+      else if ( k < 0)
+	{
+	  for (octave_idx_type i = 0; i < ndiag; i++)
+	    if (elem (i-k, i) != 0.)
+	      nel++;
+	}
+      else
+	{
+	  for (octave_idx_type i = 0; i < ndiag; i++)
+	    if (elem (i, i) != 0.)
+	      nel++;
+	}
+      
+      d = SparseBoolMatrix (ndiag, 1, nel);
+      d.xcidx (0) = 0;
+      d.xcidx (1) = nel;
+
+      octave_idx_type ii = 0;
+      if (k > 0)
+	{
+	  for (octave_idx_type i = 0; i < ndiag; i++)
+	    {
+	      bool tmp = elem (i, i+k);
+	      if (tmp != 0.)
+		{
+		  d.xdata (ii) = tmp;
+		  d.xridx (ii++) = i;
+		}
+	    }
+	}
+      else if ( k < 0)
+	{
+	  for (octave_idx_type i = 0; i < ndiag; i++)
+	    {
+	      bool tmp = elem (i-k, i);
+	      if (tmp != 0.)
+		{
+		  d.xdata (ii) = tmp;
+		  d.xridx (ii++) = i;
+		}
+	    }
+	}
+      else
+	{
+	  for (octave_idx_type i = 0; i < ndiag; i++)
+	    {
+	      bool tmp = elem (i, i);
+	      if (tmp != 0.)
+		{
+		  d.xdata (ii) = tmp;
+		  d.xridx (ii++) = i;
+		}
+	    }
+	}
+    }
+  else
+    (*current_liboctave_error_handler) 
+      ("diag: requested diagonal out of range");
+
+  return d;
+}
+
 boolMatrix
 SparseBoolMatrix::matrix_value (void) const
 {