diff liboctave/Range.cc @ 7620:36594d5bbe13

Move diag function into the octave_value class
author David Bateman <dbateman@free.fr>
date Fri, 21 Mar 2008 00:08:24 +0100
parents ba4214856f9f
children c7ff200e45f5
line wrap: on
line diff
--- a/liboctave/Range.cc
+++ b/liboctave/Range.cc
@@ -178,6 +178,40 @@
 
 }
 
+Matrix 
+Range::diag (octave_idx_type k) const
+{
+  octave_idx_type nnr = 1;
+  octave_idx_type nnc = nelem ();
+  Matrix d;
+
+  if  (nnr != 0)
+    {
+      octave_idx_type roff = 0;
+      octave_idx_type coff = 0;
+      if (k > 0)
+	{
+	  roff = 0;
+	  coff = k;
+	}
+      else if (k < 0)
+	{
+	  roff = -k;
+	  coff = 0;
+	}
+
+      // Force cached matrix to be created
+      matrix_value ();
+
+      octave_idx_type n = nnc + std::abs (k);
+      d = Matrix (n, n, Matrix::resize_fill_value ());
+      for (octave_idx_type i = 0; i < nnc; i++)
+	d.xelem (i+roff, i+coff) = cache.xelem (i);
+    }
+
+  return d;
+}
+
 Range
 Range::sort (octave_idx_type dim, sortmode mode) const
 {