mode.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include "mode.h"
  2. // Implementation
  3. #include <vector>
  4. template <typename T>
  5. IGL_INLINE void igl::mode(
  6. const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & X,
  7. const int d,
  8. Eigen::Matrix<T,Eigen::Dynamic,1> & M)
  9. {
  10. assert(d==1 || d==2);
  11. using namespace std;
  12. int m = X.rows();
  13. int n = X.cols();
  14. M.resize((d==1)?n:m,1);
  15. for(int i = 0;i<((d==2)?m:n);i++)
  16. {
  17. vector<int> counts(((d==2)?n:m),0);
  18. for(int j = 0;j<((d==2)?n:m);j++)
  19. {
  20. T v = (d==2)?X(i,j):X(j,i);
  21. for(int k = 0;k<((d==2)?n:m);k++)
  22. {
  23. T u = (d==2)?X(i,k):X(k,i);
  24. if(v == u)
  25. {
  26. counts[k]++;
  27. }
  28. }
  29. }
  30. assert(counts.size() > 0);
  31. int max_count = -1;
  32. int max_count_j = -1;
  33. int j =0;
  34. for(vector<int>::iterator it = counts.begin();it<counts.end();it++)
  35. {
  36. if(max_count < *it)
  37. {
  38. max_count = *it;
  39. max_count_j = j;
  40. }
  41. j++;
  42. }
  43. M(i,0) = (d==2)?X(i,max_count_j):X(max_count_j,i);
  44. }
  45. }
  46. #ifndef IGL_HEADER_ONLY
  47. // Explicit template specialization
  48. // generated by autoexplicit.sh
  49. template void igl::mode<double>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, int, Eigen::Matrix<double, -1, 1, 0, -1, 1>&);
  50. // generated by autoexplicit.sh
  51. template void igl::mode<int>(Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, int, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);
  52. #endif