#include "unique.h" #include "sort.h" #include "IndexComparison.h" #include "SortableRow.h" #include "list_to_matrix.h" #include #include template IGL_INLINE void igl::unique( const std::vector & A, std::vector & C, std::vector & IA, std::vector & IC) { using namespace std; std::vector IM; std::vector sortA; igl::sort(A,true,sortA,IM); // Original unsorted index map IA.resize(sortA.size()); for(int i=0;i<(int)sortA.size();i++) { IA[i] = i; } IA.erase( std::unique( IA.begin(), IA.end(), igl::IndexEquals& >(sortA)),IA.end()); IC.resize(A.size()); { int j = 0; for(int i = 0;i<(int)sortA.size();i++) { if(sortA[IA[j]] != sortA[i]) { j++; } IC[IM[i]] = j; } } C.resize(IA.size()); // Reindex IA according to IM for(int i = 0;i<(int)IA.size();i++) { IA[i] = IM[IA[i]]; C[i] = A[IA[i]]; } } template IGL_INLINE void igl::unique_rows( const Eigen::PlainObjectBase& A, Eigen::PlainObjectBase& C, Eigen::PlainObjectBase& IA, Eigen::PlainObjectBase& IC) { using namespace std; typedef Eigen::Matrix RowVector; vector > rows; rows.resize(A.rows()); // Loop over rows for(int i = 0;i(ri); } vector > vC; // unique on rows vector vIA; vector vIC; unique(rows,vC,vIA,vIC); // Convert to eigen C.resize(vC.size(),A.cols()); IA.resize(vIA.size(),1); IC.resize(vIC.size(),1); for(int i = 0;i(std::vector > const&, std::vector >&, std::vector >&, std::vector >&); template void igl::unique_rows, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::unique_rows, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::unique_rows, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); #endif