| // This file is part of libigl, a simple c++ geometry processing library. |
| // |
| // Copyright (C) 2014 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 "histc.h" |
| #include "parallel_for.h" |
| #include <cassert> |
| #include <iostream> |
| |
| template <typename DerivedX, typename DerivedE, typename DerivedN, typename DerivedB> |
| IGL_INLINE void igl::histc( |
| const Eigen::MatrixBase<DerivedX > & X, |
| const Eigen::MatrixBase<DerivedE > & E, |
| Eigen::PlainObjectBase<DerivedN > & N, |
| Eigen::PlainObjectBase<DerivedB > & 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); |
| for(int j = 0;j<m;j++) |
| { |
| if(B(j) >= 0) |
| { |
| N(int(B(j)))++; |
| } |
| } |
| } |
| |
| template <typename DerivedX, typename DerivedE, typename DerivedB> |
| IGL_INLINE void igl::histc( |
| const Eigen::MatrixBase<DerivedX > & X, |
| const Eigen::MatrixBase<DerivedE > & E, |
| Eigen::PlainObjectBase<DerivedB > & 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); |
| parallel_for(m,[&](const int j) |
| { |
| const double x = X(j); |
| // Boring one-offs |
| if(x < E(0) || x > E(E.size()-1)) |
| { |
| B(j) = -1; |
| return; |
| } |
| // 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; |
| },1000); |
| } |
| |
| template <typename DerivedE> |
| IGL_INLINE void igl::histc( |
| const typename DerivedE::Scalar & x, |
| const Eigen::MatrixBase<DerivedE > & E, |
| typename DerivedE::Index & b) |
| { |
| Eigen::Matrix<typename DerivedE::Scalar,1,1> X; |
| X(0) = x; |
| Eigen::Matrix<typename DerivedE::Index,1,1> B; |
| hist(X,E,B); |
| b = B(0); |
| } |
| |
| #ifdef IGL_STATIC_LIBRARY |
| // Explicit template instantiation |
| // TODO(iserna): Check why these instantiations result on errors. |
| // template void igl::histc<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&); |
| template void igl::histc<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, 1, 1, 0, 1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 1, 0, 1, 1> >&); |
| template void igl::histc<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&); |
| template void igl::histc<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&); |
| template void igl::histc<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&); |
| template void igl::histc<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&); |
| template void igl::histc<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&); |
| template void igl::histc<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&); |
| #if EIGEN_VERSION_AT_LEAST(3,3,0) |
| #else |
| template void igl::histc<Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<int, true>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<int, true>, Eigen::Matrix<int, -1, 1, 0, -1, 1> > > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&); |
| #endif |
| |
| #endif |