diff liboctave/idx-vector.cc @ 8384:a99b9113c58c

optimize sparse bool indexing
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 08 Dec 2008 15:33:28 +0100
parents ad8ed668e0a4
children 095ae5e0a831
line wrap: on
line diff
--- a/liboctave/idx-vector.cc	Mon Dec 08 14:56:29 2008 +0100
+++ b/liboctave/idx-vector.cc	Mon Dec 08 15:33:28 2008 +0100
@@ -32,6 +32,7 @@
 
 #include "idx-vector.h"
 #include "Array.h"
+#include "Sparse.h"
 #include "Range.h"
 
 #include "oct-locbuf.h"
@@ -312,7 +313,38 @@
 
       data = d;
 
-      ext = k;
+      ext = d[k-1] + 1;
+    }
+}
+
+idx_vector::idx_vector_rep::idx_vector_rep (const Sparse<bool>& bnda)
+  : data (0), len (0), ext (0), aowner (0), orig_dims ()
+{
+  for (octave_idx_type i = 0, l = bnda.nnz (); i < l; i++)
+    if (bnda.data (i)) len++;
+
+  dim_vector dv = bnda.dims ();
+
+  orig_dims = ((dv.length () == 2 && dv(0) == 1)
+	       ? dim_vector (1, len) : orig_dims = dim_vector (len, 1));
+
+  if (len != 0)
+    {
+      octave_idx_type *d = new octave_idx_type [len];
+
+      octave_idx_type nnz = bnda.nnz ();
+
+      octave_idx_type k = 0;
+      // FIXME: I hope this is OK, i.e. the element iterated this way are correctly ordered.
+      for (octave_idx_type i = 0; i < nnz; i++)
+        {
+          if (bnda.data (i)) 
+            d[k++] = bnda.cidx (i) + bnda.rows () * bnda.ridx (i);
+        }
+
+      data = d;
+
+      ext = d[k-1] + 1;
     }
 }