Explorar el Código

set union on matrices

Former-commit-id: f788d241afe695585a6f4401734fe31fba290dca
Alec Jacobson hace 8 años
padre
commit
06215fe09b
Se han modificado 2 ficheros con 111 adiciones y 0 borrados
  1. 68 0
      include/igl/setunion.cpp
  2. 43 0
      include/igl/setunion.h

+ 68 - 0
include/igl/setunion.cpp

@@ -0,0 +1,68 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
+#include "setunion.h"
+#include "unique.h"
+
+template <
+  typename DerivedA,
+  typename DerivedB,
+  typename DerivedC,
+  typename DerivedIA,
+  typename DerivedIB>
+IGL_INLINE void igl::setunion(
+  const Eigen::DenseBase<DerivedA> & A,
+  const Eigen::DenseBase<DerivedB> & B,
+  Eigen::PlainObjectBase<DerivedC> & C,
+  Eigen::PlainObjectBase<DerivedIA> & IA,
+  Eigen::PlainObjectBase<DerivedIB> & IB)
+{
+  DerivedC CS(A.size()+B.size(),1);
+  {
+    int k = 0;
+    for(int i = 0;i<A.rows();i++)
+    {
+      for(int j = 0;j<A.cols();j++)
+      {
+        CS(k++) = A(i,j);
+      }
+    }
+    for(int i = 0;i<B.rows();i++)
+    {
+      for(int j = 0;j<B.cols();j++)
+      {
+        CS(k++) = B(i,j);
+      }
+    }
+    assert(k==CS.size());
+  }
+  DerivedIA IAC;
+  {
+    DerivedIA IC;
+    unique(CS,C,IAC,IC);
+  }
+  const int nia = (IAC.array()<A.size()).count();
+  IA.resize(nia);
+  IB.resize(IAC.size() - nia);
+  {
+    int ka = 0;
+    int kb = 0;
+    for(int i = 0;i<IAC.size();i++)
+    {
+      if(IAC(i)<A.size())
+      {
+        IA(ka++) = IAC(i);
+      }else
+      {
+        IB(kb++) = IAC(i)-A.size();
+      }
+    }
+    assert(ka == IA.size());
+    assert(kb == IB.size());
+  }
+
+}

+ 43 - 0
include/igl/setunion.h

@@ -0,0 +1,43 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+// 
+// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>
+// 
+// This Source Code Form is subject to the terms of the Mozilla Public License 
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can 
+// obtain one at http://mozilla.org/MPL/2.0/.
+#ifndef IGL_SETUNION_H
+#define IGL_SETUNION_H
+#include "igl_inline.h"
+#include <Eigen/Core>
+namespace igl
+{
+  // Union of elements of matrices (like matlab's `union`)
+  //
+  // Inputs:
+  //   A  m-long vector of indices
+  //   B  n-long vector of indices
+  // Outputs:
+  //   C  (k>=m)-long vector of unique elements appearing in A and/or B
+  //   IA  (<k>=m)-long list of indices into A so that C = sort([A(IA);B(IB)])
+  //   IB  (<k>=m)-long list of indices into B so that C = sort([A(IA);B(IB)])
+  //
+  template <
+    typename DerivedA,
+    typename DerivedB,
+    typename DerivedC,
+    typename DerivedIA,
+    typename DerivedIB>
+  IGL_INLINE void setunion(
+    const Eigen::DenseBase<DerivedA> & A,
+    const Eigen::DenseBase<DerivedB> & B,
+    Eigen::PlainObjectBase<DerivedC> & C,
+    Eigen::PlainObjectBase<DerivedIA> & IA,
+    Eigen::PlainObjectBase<DerivedIB> & IB);
+}
+
+#ifndef IGL_STATIC_LIBRARY
+#  include "setunion.cpp"
+#endif
+#endif
+
+