diff liboctave/intNDArray.cc @ 6979:2883ea1c5c18

[project @ 2007-10-08 20:23:48 by dbateman]
author dbateman
date Mon, 08 Oct 2007 20:26:01 +0000
parents 7e958a1532c6
children 93c65f2a5668
line wrap: on
line diff
--- a/liboctave/intNDArray.cc
+++ b/liboctave/intNDArray.cc
@@ -61,6 +61,68 @@
   return false;
 }
 
+
+template <class T>
+intNDArray<T>
+intNDArray<T>::diag (void) const
+{
+  return diag (0);
+}
+
+template <class T>
+intNDArray<T>
+intNDArray<T>::diag (octave_idx_type k) const
+{
+  dim_vector dv = this->dims ();
+  octave_idx_type nd = dv.length ();
+
+  if (nd > 2)
+    {
+      (*current_liboctave_error_handler) ("Matrix must be 2-dimensional");    
+      return intNDArray<T>();
+    }
+  else
+    {
+      octave_idx_type nnr = dv (0);
+      octave_idx_type nnc = dv (1);
+
+      if (k > 0)
+	nnc -= k;
+      else if (k < 0)
+	nnr += k;
+
+      intNDArray<T> 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.xelem (i) = this->elem (i, i+k);
+	    }
+	  else if (k < 0)
+	    {
+	      for (octave_idx_type i = 0; i < ndiag; i++)
+		d.xelem (i) = this->elem (i-k, i);
+	    }
+	  else
+	    {
+	      for (octave_idx_type i = 0; i < ndiag; i++)
+		d.xelem (i) = this->elem (i, i);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler)
+	  ("diag: requested diagonal out of range");
+
+      return d;
+    }
+}
+
 // FIXME -- this is not quite the right thing.
 
 template <class T>