diff liboctave/Sparse.cc @ 10531:2dd8ea8bfd71

basic cat functionality in liboctave
author Jaroslav Hajek <highegg@gmail.com>
date Sun, 18 Apr 2010 17:56:16 +0200
parents b4d2080b6df7
children f094ac9bc93e
line wrap: on
line diff
--- a/liboctave/Sparse.cc	Sat Apr 17 20:37:51 2010 -0400
+++ b/liboctave/Sparse.cc	Sun Apr 18 17:56:16 2010 +0200
@@ -2377,6 +2377,73 @@
 }
 
 template <class T>
+Sparse<T>
+Sparse<T>::cat (int dim, octave_idx_type n, const Sparse<T> *sparse_list)
+{
+  dim_vector dv;
+  octave_idx_type total_nz = 0;
+  if (dim == 0 || dim == 1)
+    {
+      for (octave_idx_type i = 0; i < n; i++)
+        {
+          if (! dv.concat (sparse_list[i].dims (), dim))
+            (*current_liboctave_error_handler)
+              ("cat: dimension mismatch");
+          total_nz += sparse_list[i].nnz ();
+        }
+    }
+
+  Sparse<T> retval (dv, total_nz);
+
+  switch (dim)
+    {
+    case 0:
+      {
+        // sparse vertcat. This is not efficiently handled by assignment, so
+        // we'll do it directly.
+        octave_idx_type l = 0;
+        for (octave_idx_type j = 0; j < n; j++)
+          {
+            octave_idx_type rcum = 0;
+            for (octave_idx_type i = 0; i < n; i++)
+              {
+                const Sparse<T>& spi = sparse_list[i];
+                octave_idx_type kl = spi.cidx(j), ku = spi.cidx(j+1);
+                for (octave_idx_type k = kl; k < ku; k++, l++)
+                  {
+                    retval.xridx(l) = spi.ridx(k) + rcum;
+                    retval.xdata(l) = spi.data(k);
+                  }
+
+                rcum += spi.rows ();
+              }
+
+            retval.xcidx(j+1) = l;
+          }
+
+        break;
+      }
+    case 1:
+      {
+        octave_idx_type ccum = 0;
+        for (octave_idx_type i = 0; i < n; i++)
+          {
+            octave_idx_type l = ccum, u = ccum + sparse_list[i].columns ();
+            retval.assign (idx_vector::colon, idx_vector (l, u), sparse_list[i]);
+            ccum = u;
+          }
+
+        break;
+      }
+    default:
+      (*current_liboctave_error_handler)
+        ("cat: invalid dimension for sparse concatenation");
+    }
+
+  return retval;
+}
+
+template <class T>
 Array<T>
 Sparse<T>::array_value () const
 {