diff liboctave/chMatrix.cc @ 6979:2883ea1c5c18

[project @ 2007-10-08 20:23:48 by dbateman]
author dbateman
date Mon, 08 Oct 2007 20:26:01 +0000
parents 7f5316cadaa2
children 93c65f2a5668
line wrap: on
line diff
--- a/liboctave/chMatrix.cc
+++ b/liboctave/chMatrix.cc
@@ -189,6 +189,53 @@
   return result;
 }
 
+charMatrix
+charMatrix::diag (void) const
+{
+  return diag (0);
+}
+
+charMatrix
+charMatrix::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;
+
+  charMatrix d;
+
+  if (nnr > 0 && nnc > 0)
+    {
+      octave_idx_type ndiag = (nnr < nnc) ? nnr : nnc;
+
+      d.resize (ndiag, 1);
+
+      if (k > 0)
+	{
+	  for (octave_idx_type i = 0; i < ndiag; i++)
+	    d.xelem (i) = elem (i, i+k);
+	}
+      else if (k < 0)
+	{
+	  for (octave_idx_type i = 0; i < ndiag; i++)
+	    d.xelem (i) = elem (i-k, i);
+	}
+      else
+	{
+	  for (octave_idx_type i = 0; i < ndiag; i++)
+	    d.xelem (i) = elem (i, i);
+	}
+    }
+  else
+    (*current_liboctave_error_handler)
+      ("diag: requested diagonal out of range");
+
+  return d;
+}
+
 // FIXME Do these really belong here?  Maybe they should be
 // in a base class?