changeset 11671:1507a9d6df40 release-3-0-x

__lin_interpn__.cc: handle decreasing coordinate values
author Alexander Barth
date Thu, 06 Mar 2008 01:58:38 -0500
parents b1368dc9e719
children a5a86cc9ef38
files src/ChangeLog src/DLD-FUNCTIONS/__lin_interpn__.cc
diffstat 2 files changed, 64 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Wed Mar 05 04:58:54 2008 -0500
+++ b/src/ChangeLog	Thu Mar 06 01:58:38 2008 -0500
@@ -1,3 +1,8 @@
+2008-03-06  Alexander Barth  <barth.alexander@gmail.com>
+
+	* DLD-FUNCTIONS/__lin_interpn__.cc (lookup):
+	Handle decreasing coordinate values.
+
 2008-02-27  John W. Eaton  <jwe@octave.org>
 
 	* oct-stream.cc (do_read): Stop reading if seek fails.
--- a/src/DLD-FUNCTIONS/__lin_interpn__.cc	Wed Mar 05 04:58:54 2008 -0500
+++ b/src/DLD-FUNCTIONS/__lin_interpn__.cc	Thu Mar 06 01:58:38 2008 -0500
@@ -43,38 +43,77 @@
 octave_idx_type
 lookup (const double *x, octave_idx_type n, double y)
 {
-  octave_idx_type j, j0, j1;
+  octave_idx_type j;
 
-  if (y > x[n-1] || y < x[0])
-    return -1;
+  if (x[0] < x[n-1])
+    {
+      // increasing x
+
+      if (y > x[n-1] || y < x[0])
+	return -1;
 
 #ifdef EXHAUSTIF
-  for (j = 0; j < n - 1; j++)
-    {
-      if (x[j] <= y && y <= x[j+1])
-	return j;
-    }
+      for (j = 0; j < n - 1; j++)
+	{
+	  if (x[j] <= y && y <= x[j+1])
+	    return j;
+	}
 #else
-  j0 = 0;
-  j1 = n - 1;
+      octave_idx_type j0 = 0;
+      octave_idx_type j1 = n - 1;
+
+      while (true)
+	{
+	  j = (j0+j1)/2;
+
+	  if (y <= x[j+1])
+	    {
+	      if (x[j] <= y)
+		return j;
 
-  while (true)
+	      j1 = j;
+	    }
+
+	  if (x[j] <= y)
+	    j0 = j;
+	}
+#endif
+    }
+  else
     {
-      j = (j0+j1)/2;
+      // decreasing x
+      // previous code with x -> -x and y -> -y
 
-      if (y <= x[j+1])
+      if (y > x[0] || y < x[n-1])
+	return -1;
+
+#ifdef EXHAUSTIF
+      for (j = 0; j < n - 1; j++)
 	{
-	  if (x[j] <= y)
+	  if (x[j+1] <= y && y <= x[j])
 	    return j;
-
-	  j1 = j;
 	}
+#else
+      octave_idx_type j0 = 0;
+      octave_idx_type j1 = n - 1;
 
-      if (x[j] <= y)
-	j0 = j;
+      while (true)
+	{
+	  j = (j0+j1)/2;
+
+	  if (y >= x[j+1])
+	    {
+	      if (x[j] >= y)
+		return j;
+
+	      j1 = j;
+	    }
+
+	  if (x[j] >= y)
+	    j0 = j;
+	}
+#endif
     }
-
-#endif
 }
 
 // n-dimensional linear interpolation