// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2014 Alec Jacobson // // 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 "histc.h" #include #include template IGL_INLINE void igl::histc( const Eigen::MatrixBase & X, const Eigen::MatrixBase & E, Eigen::PlainObjectBase & N, Eigen::PlainObjectBase & B) { histc(X,E,B); const int n = E.size(); const int m = X.size(); assert(m == B.size()); N.resize(n,1); N.setConstant(0); #pragma omp parallel for for(int j = 0;j= 0) { #pragma omp atomic N(B(j))++; } } } template IGL_INLINE void igl::histc( const Eigen::MatrixBase & X, const Eigen::MatrixBase & E, Eigen::PlainObjectBase & B) { const int m = X.size(); using namespace std; assert( (E.bottomRightCorner(E.size()-1,1) - E.topLeftCorner(E.size()-1,1)).maxCoeff() >= 0 && "E should be monotonically increasing"); B.resize(m,1); #pragma omp parallel for for(int j = 0;j E(E.size()-1)) { B(j) = -1; continue; } // Find x in E int l = 0; int h = E.size()-1; int k = l; while((h-l)>1) { assert(x >= E(l)); assert(x <= E(h)); k = (h+l)/2; if(x < E(k)) { h = k; }else { l = k; } } if(x == E(h)) { k = h; }else { k = l; } B(j) = k; } } template IGL_INLINE void igl::histc( const typename DerivedE::Scalar & x, const Eigen::MatrixBase & E, typename DerivedE::Index & b) { Eigen::Matrix X; X(0) = x; Eigen::Matrix B; hist(X,E,B); b = B(0); } #ifdef IGL_STATIC_LIBRARY // Explicit template instantiation // generated by autoexplicit.sh template void igl::histc, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::histc, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::histc, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::histc, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&); template void igl::histc, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&); #if EIGEN_VERSION_AT_LEAST(3,3,0) #else template void igl::histc, Eigen::Matrix >, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase, Eigen::Matrix > > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); #endif #endif