Index: trunk/Ohana/src/opihi/cmd.data/subset.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/subset.c	(revision 7917)
+++ trunk/Ohana/src/opihi/cmd.data/subset.c	(revision 20936)
@@ -6,5 +6,5 @@
   
   char *out;
-  int  i, j, size;
+  int  i, Npts, size;
   Vector *ivec, *ovec, *tvec;
 
@@ -28,13 +28,47 @@
   /* check size of ivec, tvec: must match */
 
-  REALLOCATE (ovec[0].elements, float, MAX (tvec[0].Nelements, 1));
-  for (j = i = 0; i < tvec[0].Nelements; i++) {
-    if (tvec[0].elements[i]) {
-      ovec[0].elements[j] = ivec[0].elements[i];
-      j++;
+  // ovec matches ivec in type
+  ResetVector (ovec, ivec->type, MAX (tvec[0].Nelements, 1));
+
+  // we have four cases: (ivec == flt or int) and (tvec == flt or int)
+  if ((ivec->type == OPIHI_FLT) && (tvec->type == OPIHI_FLT)) {
+    opihi_flt *vi = ivec[0].elements.Flt;
+    opihi_flt *vt = tvec[0].elements.Flt;
+    for (Npts = i = 0; i < tvec[0].Nelements; i++, vi++, vt++) {
+      if (!*vt) continue;
+      ovec[0].elements.Flt[Npts] = *vi;
+      Npts++;
     }
   }
-  ovec[0].Nelements = j;
-  REALLOCATE (ovec[0].elements, float, MAX (ovec[0].Nelements, 1));
+  if ((ivec->type == OPIHI_FLT) && (tvec->type == OPIHI_INT)) {
+    opihi_flt *vi = ivec[0].elements.Flt;
+    opihi_int *vt = tvec[0].elements.Int;
+    for (Npts = i = 0; i < tvec[0].Nelements; i++, vi++, vt++) {
+      if (!*vt) continue;
+      ovec[0].elements.Flt[Npts] = *vi;
+      Npts++;
+    }
+  }
+  if ((ivec->type == OPIHI_INT) && (tvec->type == OPIHI_FLT)) {
+    opihi_int *vi = ivec[0].elements.Int;
+    opihi_flt *vt = tvec[0].elements.Flt;
+    for (Npts = i = 0; i < tvec[0].Nelements; i++, vi++, vt++) {
+      if (!*vt) continue;
+      ovec[0].elements.Int[Npts] = *vi;
+      Npts++;
+    }
+  }
+  if ((ivec->type == OPIHI_INT) && (tvec->type == OPIHI_INT)) {
+    opihi_int *vi = ivec[0].elements.Int;
+    opihi_int *vt = tvec[0].elements.Int;
+    for (Npts = i = 0; i < tvec[0].Nelements; i++, vi++, vt++) {
+      if (!*vt) continue;
+      ovec[0].elements.Int[Npts] = *vi;
+      Npts++;
+    }
+  }
+
+  // free up unused memory
+  ResetVector (ovec, ivec->type, MAX (Npts, 1));
 
   DeleteVector (tvec);
