mode.cpp 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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. #endif