diff src/Cell.cc @ 7618:3209a584e1ac

Further type preservation tests and fix of diag for cell arrays
author David Bateman <dbateman@free.fr>
date Thu, 20 Mar 2008 20:54:19 +0100
parents bb0f2353cff5
children 36594d5bbe13
line wrap: on
line diff
--- a/src/Cell.cc	Thu Mar 20 17:00:15 2008 +0100
+++ b/src/Cell.cc	Thu Mar 20 20:54:19 2008 +0100
@@ -238,6 +238,52 @@
   return retval;
 }
 
+Cell
+Cell::diag (void) const
+{
+  return diag (0);
+}
+
+Cell
+Cell::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;
+
+  Cell d;
+
+  if (nnr > 0 && nnc > 0)
+    {
+      octave_idx_type ndiag = (nnr < nnc) ? nnr : nnc;
+
+      d.resize (dim_vector (ndiag, 1));
+
+      if (k > 0)
+	{
+	  for (octave_idx_type i = 0; i < ndiag; i++)
+	    d.elem (i) = elem (i, i+k);
+	}
+      else if (k < 0)
+	{
+	  for (octave_idx_type i = 0; i < ndiag; i++)
+	    d.elem (i) = elem (i-k, i);
+	}
+      else
+	{
+	  for (octave_idx_type i = 0; i < ndiag; i++)
+	    d.elem (i) = elem (i, i);
+	}
+    }
+  else
+    error ("diag: requested diagonal out of range");
+
+  return d;
+}
+
 /*
 ;;; Local Variables: ***
 ;;; mode: C++ ***