diff src/DLD-FUNCTIONS/lookup.cc @ 10327:76cf6dd20f1a

take advantage of lazy index optimization in lookup
author Jaroslav Hajek <highegg@gmail.com>
date Wed, 17 Feb 2010 08:29:17 +0100
parents e317791645c4
children 2516ca5763e9
line wrap: on
line diff
--- a/src/DLD-FUNCTIONS/lookup.cc	Wed Feb 17 08:19:06 2010 +0100
+++ b/src/DLD-FUNCTIONS/lookup.cc	Wed Feb 17 08:29:17 2010 +0100
@@ -131,43 +131,54 @@
     }
   else if (match_idx || left_inf || right_inf)
     {
-      NDArray ridx (idx.dims ());
       if (match_idx)
         {
+          NDArray ridx (idx.dims ());
+
           for (octave_idx_type i = 0; i < nval; i++)
             {
               octave_idx_type j = idx.xelem (i);
               ridx.xelem (i) = (j != 0 && values(i) == array(j-1)) ? j : 0;
             }
+
+          retval = ridx; 
         }
       else if (left_inf && right_inf)
         {
+          // Results in valid indices. Optimize using lazy index.
+          octave_idx_type zero = 0;
           for (octave_idx_type i = 0; i < nval; i++)
             {
-              octave_idx_type one = 1;
-              octave_idx_type j = idx.xelem (i);
-              ridx.xelem (i) = std::min (std::max (one, j), n-1);
+              octave_idx_type j = idx.xelem (i) - 1;
+              idx.xelem (i) = std::max (zero, std::min (j, n-2));
             }
+
+          retval = idx_vector (idx);
         }
       else if (left_inf)
         {
-          octave_idx_type one = 1;
+          // Results in valid indices. Optimize using lazy index.
+          octave_idx_type zero = 0;
           for (octave_idx_type i = 0; i < nval; i++)
             {
-              octave_idx_type j = idx.xelem (i);
-              ridx.xelem (i) = std::max (one, j);
+              octave_idx_type j = idx.xelem (i) - 1;
+              idx.xelem (i) = std::max (zero, j);
             }
+
+          retval = idx_vector (idx);
         }
       else if (right_inf)
         {
+          NDArray ridx (idx.dims ());
+
           for (octave_idx_type i = 0; i < nval; i++)
             {
               octave_idx_type j = idx.xelem (i);
               ridx.xelem (i) = std::min (j, n-1);
             }
+
+          retval = ridx;
         }
-
-      retval = ridx;
     }
   else
     retval = idx;