changeset 9658:3429c956de6f

extend linspace & fix up liboctave rewrite
author Jaroslav Hajek <highegg@gmail.com>
date Sat, 19 Sep 2009 22:17:12 +0200
parents 3c1c3a38ec7b
children 0bcfeadb6178
files liboctave/CMatrix.cc liboctave/CRowVector.cc liboctave/dMatrix.cc liboctave/dRowVector.cc liboctave/fCMatrix.cc liboctave/fCRowVector.cc liboctave/fMatrix.cc liboctave/fRowVector.cc src/ChangeLog src/data.cc
diffstat 10 files changed, 71 insertions(+), 65 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/CMatrix.cc	Sat Sep 19 21:38:30 2009 +0200
+++ b/liboctave/CMatrix.cc	Sat Sep 19 22:17:12 2009 +0200
@@ -4085,13 +4085,13 @@
     retval(i, 0) = x1(i);
 
   // The last column is not needed while using delta.
-  Complex *delta = &retval(0, 1); 
+  Complex *delta = &retval(0, n-1); 
   for (octave_idx_type i = 0; i < m; i++)
     delta[i] = (x2(i) - x1(i)) / (n - 1.0);
 
   for (octave_idx_type j = 1; j < n-1; j++)
     for (octave_idx_type i = 0; i < m; i++)
-      retval(i, j) = retval(i, j-1) + delta[i];
+      retval(i, j) = x1(i) + static_cast<double> (j)*delta[i];
 
   for (octave_idx_type i = 0; i < m; i++)
     retval(i, n-1) = x2(i);
--- a/liboctave/CRowVector.cc	Sat Sep 19 21:38:30 2009 +0200
+++ b/liboctave/CRowVector.cc	Sat Sep 19 22:17:12 2009 +0200
@@ -487,9 +487,9 @@
   NoAlias<ComplexRowVector> retval (n);
 
   Complex delta = (x2 - x1) / (n - 1.0);
-  Complex y = retval(0) = x1;
+  retval(0) = x1;
   for (octave_idx_type i = 1; i < n-1; i++)
-    retval(i) = y += delta;
+    retval(i) = x1 + static_cast<double> (i)*delta;
   retval(n-1) = x2;
 
   return retval;
--- a/liboctave/dMatrix.cc	Sat Sep 19 21:38:30 2009 +0200
+++ b/liboctave/dMatrix.cc	Sat Sep 19 22:17:12 2009 +0200
@@ -3414,13 +3414,13 @@
     retval(i, 0) = x1(i);
 
   // The last column is not needed while using delta.
-  double *delta = &retval(0, 1); 
+  double *delta = &retval(0, n-1); 
   for (octave_idx_type i = 0; i < m; i++)
     delta[i] = (x2(i) - x1(i)) / (n - 1);
 
   for (octave_idx_type j = 1; j < n-1; j++)
     for (octave_idx_type i = 0; i < m; i++)
-      retval(i, j) = retval(i, j-1) + delta[i];
+      retval(i, j) = x1(i) + j*delta[i];
 
   for (octave_idx_type i = 0; i < m; i++)
     retval(i, n-1) = x2(i);
--- a/liboctave/dRowVector.cc	Sat Sep 19 21:38:30 2009 +0200
+++ b/liboctave/dRowVector.cc	Sat Sep 19 22:17:12 2009 +0200
@@ -316,9 +316,9 @@
   NoAlias<RowVector> retval (n);
 
   double delta = (x2 - x1) / (n - 1);
-  double y = retval(0) = x1;
+  retval(0) = x1;
   for (octave_idx_type i = 1; i < n-1; i++)
-    retval(i) = y += delta;
+    retval(i) = x1 + i*delta;
   retval(n-1) = x2;
 
   return retval;
--- a/liboctave/fCMatrix.cc	Sat Sep 19 21:38:30 2009 +0200
+++ b/liboctave/fCMatrix.cc	Sat Sep 19 22:17:12 2009 +0200
@@ -4078,13 +4078,13 @@
     retval(i, 0) = x1(i);
 
   // The last column is not needed while using delta.
-  FloatComplex *delta = &retval(0, 1); 
+  FloatComplex *delta = &retval(0, n-1); 
   for (octave_idx_type i = 0; i < m; i++)
     delta[i] = (x2(i) - x1(i)) / (n - 1.0f);
 
   for (octave_idx_type j = 1; j < n-1; j++)
     for (octave_idx_type i = 0; i < m; i++)
-      retval(i, j) = retval(i, j-1) + delta[i];
+      retval(i, j) = x1(i) + static_cast<float> (j)*delta[i];
 
   for (octave_idx_type i = 0; i < m; i++)
     retval(i, n-1) = x2(i);
--- a/liboctave/fCRowVector.cc	Sat Sep 19 21:38:30 2009 +0200
+++ b/liboctave/fCRowVector.cc	Sat Sep 19 22:17:12 2009 +0200
@@ -487,9 +487,9 @@
   NoAlias<FloatComplexRowVector> retval (n);
 
   FloatComplex delta = (x2 - x1) / (n - 1.0f);
-  FloatComplex y = retval(0) = x1;
+  retval(0) = x1;
   for (octave_idx_type i = 1; i < n-1; i++)
-    retval(i) = y += delta;
+    retval(i) = x1 + static_cast<float> (i)*delta;
   retval(n-1) = x2;
 
   return retval;
--- a/liboctave/fMatrix.cc	Sat Sep 19 21:38:30 2009 +0200
+++ b/liboctave/fMatrix.cc	Sat Sep 19 22:17:12 2009 +0200
@@ -3413,13 +3413,13 @@
     retval(i, 0) = x1(i);
 
   // The last column is not needed while using delta.
-  float *delta = &retval(0, 1); 
+  float *delta = &retval(0, n-1); 
   for (octave_idx_type i = 0; i < m; i++)
     delta[i] = (x2(i) - x1(i)) / (n - 1);
 
   for (octave_idx_type j = 1; j < n-1; j++)
     for (octave_idx_type i = 0; i < m; i++)
-      retval(i, j) = retval(i, j-1) + delta[i];
+      retval(i, j) = x1(i) + j*delta[i];
 
   for (octave_idx_type i = 0; i < m; i++)
     retval(i, n-1) = x2(i);
--- a/liboctave/fRowVector.cc	Sat Sep 19 21:38:30 2009 +0200
+++ b/liboctave/fRowVector.cc	Sat Sep 19 22:17:12 2009 +0200
@@ -316,9 +316,9 @@
   NoAlias<FloatRowVector> retval (n);
 
   float delta = (x2 - x1) / (n - 1);
-  float y = retval(0) = x1;
+  retval(0) = x1;
   for (octave_idx_type i = 1; i < n-1; i++)
-    retval(i) = y += delta;
+    retval(i) = x1 + i*delta;
   retval(n-1) = x2;
 
   return retval;
--- a/src/ChangeLog	Sat Sep 19 21:38:30 2009 +0200
+++ b/src/ChangeLog	Sat Sep 19 22:17:12 2009 +0200
@@ -1,6 +1,8 @@
 2009-09-19  Jaroslav Hajek  <highegg@gmail.com>
 
 	* ov.h (octave_value_extract): New template function.
+	* data.cc (do_linspace): New static template function.
+	(Flinspace): Rewrite.
 
 2009-09-18  John W. Eaton  <jwe@octave.org>
 
--- a/src/data.cc	Sat Sep 19 21:38:30 2009 +0200
+++ b/src/data.cc	Sat Sep 19 22:17:12 2009 +0200
@@ -45,6 +45,7 @@
 #include "lo-math.h"
 #include "str-vec.h"
 #include "quit.h"
+#include "mx-base.h"
 
 #include "Cell.h"
 #include "defun.h"
@@ -4382,6 +4383,50 @@
 
  */
 
+template <class MT>
+static octave_value 
+do_linspace (const octave_value& base, const octave_value& limit,
+             octave_idx_type n)
+{
+  typedef typename MT::column_vector_type CVT;
+  typedef typename MT::element_type T;
+
+  octave_value retval;
+
+  if (base.is_scalar_type ())
+    {
+      T bs = octave_value_extract<T> (base);
+      if (limit.is_scalar_type ())
+        {
+          T ls = octave_value_extract<T> (limit);
+          retval = linspace (bs, ls, n);
+        }
+      else
+        {
+          CVT lv = octave_value_extract<CVT> (limit);
+          CVT bv (lv.length (), bs);
+          retval = linspace (bv, lv, n);
+        }
+    }
+  else
+    {
+      CVT bv = octave_value_extract<CVT> (base);
+      if (limit.is_scalar_type ())
+        {
+          T ls = octave_value_extract<T> (limit);
+          CVT lv (bv.length (), ls);
+          retval = linspace (bv, lv, n);
+        }
+      else
+        {
+          CVT lv = octave_value_extract<CVT> (limit);
+          retval = linspace (bv, lv, n);
+        }
+    }
+
+  return retval;
+}
+
 DEFUN (linspace, args, ,
   "-*- texinfo -*-\n\
 @deftypefn {Built-in Function} {} linspace (@var{base}, @var{limit}, @var{n})\n\
@@ -4392,7 +4437,9 @@
 stored in decreasing order.  If the number of points is not specified, a\n\
 value of 100 is used.\n\
 \n\
-The @code{linspace} function always returns a row vector.\n\
+The @code{linspace} function always returns a row vector if both\n\
+@var{base} and @var{limit} are scalars. If one of them or both are column\n\
+vectors, @code{linspace} returns a matrix.\n\
 \n\
 For compatibility with @sc{matlab}, return the second argument if\n\
 fewer than two values are requested.\n\
@@ -4421,60 +4468,17 @@
       if (arg_1.is_single_type () || arg_2.is_single_type ())
 	{
 	  if (arg_1.is_complex_type () || arg_2.is_complex_type ())
-	    {
-	      FloatComplex x1 = arg_1.float_complex_value ();
-	      FloatComplex x2 = arg_2.float_complex_value ();
-
-	      if (! error_state)
-		{
-		  FloatComplexRowVector rv = linspace (x1, x2, npoints);
-
-		  if (! error_state)
-		    retval = rv;
-		}
-	    }
+            retval = do_linspace<FloatComplexMatrix> (arg_1, arg_2, npoints);
 	  else
-	    {
-	      float x1 = arg_1.float_value ();
-	      float x2 = arg_2.float_value ();
-
-	      if (! error_state)
-		{
-		  FloatRowVector rv = linspace (x1, x2, npoints);
-
-		  if (! error_state)
-		    retval = rv;
-		}
-	    }
+            retval = do_linspace<FloatMatrix> (arg_1, arg_2, npoints);
+	    
 	}
       else
 	{
 	  if (arg_1.is_complex_type () || arg_2.is_complex_type ())
-	    {
-	      Complex x1 = arg_1.complex_value ();
-	      Complex x2 = arg_2.complex_value ();
-
-	      if (! error_state)
-		{
-		  ComplexRowVector rv = linspace (x1, x2, npoints);
-
-		  if (! error_state)
-		    retval = rv;
-		}
-	    }
+            retval = do_linspace<ComplexMatrix> (arg_1, arg_2, npoints);
 	  else
-	    {
-	      double x1 = arg_1.double_value ();
-	      double x2 = arg_2.double_value ();
-
-	      if (! error_state)
-		{
-		  RowVector rv = linspace (x1, x2, npoints);
-
-		  if (! error_state)
-		    retval = rv;
-		}
-	    }
+            retval = do_linspace<Matrix> (arg_1, arg_2, npoints);
 	}
     }
   else