diff liboctave/intNDArray.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 24abf5a702d9
children 008f3985c8c0
line wrap: on
line diff
--- a/liboctave/intNDArray.cc
+++ b/liboctave/intNDArray.cc
@@ -60,66 +60,11 @@
   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;
-    }
+  return MArrayN<T>::diag (k);
 }
 
 // FIXME -- this is not quite the right thing.