IGL_INLINE void igl::setdiff( const Eigen::PlainObjectBase<DerivedA> & A, const Eigen::PlainObjectBase<DerivedB> & B, Eigen::PlainObjectBase<DerivedC> & C, Eigen::PlainObjectBase<DerivedIA> & IA) { using namespace Eigen; using namespace std; // boring base cases if(A.size() == 0) { C.resize(0,1); IA.resize(0,1); } if(B.size() == 0) { C.resize(A.size(),1); copy(A.data(),A.data()+A.size(),C.data()); IA = igl::colon<typename DerivedIA::Scalar>(0,C.size()-1); } // Get rid of any duplicates typedef Matrix<typename DerivedA::Scalar,Dynamic,1> VectorA; typedef Matrix<typename DerivedB::Scalar,Dynamic,1> VectorB; VectorA uA; VectorB uB; typedef PlainObjectBase<DerivedIA> IAType; IAType uIA,uIuA,uIB,uIuB; unique(A,uA,uIA,uIuA); unique(B,uB,uIB,uIuB); // Sort both VectorA sA; VectorB sB; IAType sIA,sIB; sort(uA,1,true,sA,sIA); sort(uB,1,true,sB,sIB); vector<typename DerivedB::Scalar> vC; vector<typename DerivedIA::Scalar> vIA; int bi = 0; // loop over sA bool past = false; for(int a = 0;a<sA.size();a++) { while(!past && sA(a)>sB(bi)) { bi++; past = bi>=sB.size(); } if(past || sA(a)<sB(bi)) { // then sA(a) did not appear in sB vC.push_back(sA(a)); vIA.push_back(uIA(sIA(a))); } } list_to_matrix(vC,C); list_to_matrix(vIA,IA); }
IGL_INLINE void igl::ismember( const Eigen::MatrixBase<DerivedA> & A, const Eigen::MatrixBase<DerivedB> & B, Eigen::PlainObjectBase<DerivedIA> & IA, Eigen::PlainObjectBase<DerivedLOCB> & LOCB) { using namespace Eigen; using namespace std; IA.resizeLike(A); IA.setConstant(false); LOCB.resizeLike(A); LOCB.setConstant(-1); // boring base cases if(A.size() == 0) { return; } if(B.size() == 0) { return; } // Get rid of any duplicates typedef Matrix<typename DerivedA::Scalar,Dynamic,1> VectorA; typedef Matrix<typename DerivedB::Scalar,Dynamic,1> VectorB; const VectorA vA(Eigen::Map<const VectorA>(DerivedA(A).data(), A.cols()*A.rows(),1)); const VectorB vB(Eigen::Map<const VectorB>(DerivedB(B).data(), B.cols()*B.rows(),1)); VectorA uA; VectorB uB; Eigen::Matrix<typename DerivedA::Index,Dynamic,1> uIA,uIuA,uIB,uIuB; unique(vA,uA,uIA,uIuA); unique(vB,uB,uIB,uIuB); // Sort both VectorA sA; VectorB sB; Eigen::Matrix<typename DerivedA::Index,Dynamic,1> sIA,sIB; sort(uA,1,true,sA,sIA); sort(uB,1,true,sB,sIB); Eigen::Matrix<bool,Eigen::Dynamic,1> uF = Eigen::Matrix<bool,Eigen::Dynamic,1>::Zero(sA.size(),1); Eigen::Matrix<typename DerivedLOCB::Scalar, Eigen::Dynamic,1> uLOCB = Eigen::Matrix<typename DerivedLOCB::Scalar,Eigen::Dynamic,1>:: Constant(sA.size(),1,-1); { int bi = 0; // loop over sA bool past = false; for(int a = 0;a<sA.size();a++) { while(!past && sA(a)>sB(bi)) { bi++; past = bi>=sB.size(); } if(!past && sA(a)==sB(bi)) { uF(sIA(a)) = true; uLOCB(sIA(a)) = uIB(sIB(bi)); } } } Map< Matrix<typename DerivedIA::Scalar,Dynamic,1> > vIA(IA.data(),IA.cols()*IA.rows(),1); Map< Matrix<typename DerivedLOCB::Scalar,Dynamic,1> > vLOCB(LOCB.data(),LOCB.cols()*LOCB.rows(),1); for(int a = 0;a<A.size();a++) { vIA(a) = uF(uIuA(a)); vLOCB(a) = uLOCB(uIuA(a)); } }