EMDDistanceSingle.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /**
  2. * @file EMDDistanceSingle.cpp
  3. * @brief Earth Movers Distance
  4. * @author Erik Rodner
  5. * @date 10/24/2007
  6. */
  7. #ifdef NOVISUAL
  8. #include <vislearning/nice_nonvis.h>
  9. #else
  10. #include <vislearning/nice.h>
  11. #endif
  12. #include <iostream>
  13. #include "vislearning/math/distances/emd.h"
  14. #include "vislearning/math/distances/EMDDistanceSingle.h"
  15. using namespace OBJREC;
  16. using namespace std;
  17. // refactor-nice.pl: check this substitution
  18. // old: using namespace ice;
  19. using namespace NICE;
  20. float simple_distance(double **x, double **y)
  21. {
  22. double *xx = *x;
  23. double *yy = *y;
  24. return fabs(xx[0]-yy[0]);
  25. }
  26. EMDDistanceSingle::EMDDistanceSingle()
  27. {
  28. }
  29. EMDDistanceSingle::~EMDDistanceSingle()
  30. {
  31. }
  32. // refactor-nice.pl: check this substitution
  33. // old: double EMDDistanceSingle::calculate (const Vector & x, const Vector & y) const
  34. double EMDDistanceSingle::doCalculate(const NICE::Vector & x, const NICE::Vector & y) const
  35. {
  36. signature_t x_signature;
  37. signature_t y_signature;
  38. if (x.size() != y.size())
  39. {
  40. fprintf(stderr, "EMDDistanceSingle::distance: wrong dimensions: x.size()=%d, y.size()=%d\n",
  41. x.size(), y.size());
  42. exit(-1);
  43. }
  44. x_signature.n = x.size();
  45. y_signature.n = y.size();
  46. x_signature.Features = new double * [ x_signature.n ];
  47. x_signature.Weights = new float [ x_signature.n ];
  48. y_signature.Features = new double * [ y_signature.n ];
  49. y_signature.Weights = new float [ y_signature.n ];
  50. double *dataX = const_cast<double *>(x.getDataPointer());
  51. double *dataY = const_cast<double *>(y.getDataPointer());
  52. for (int i = 0; i < x_signature.n ; i++)
  53. {
  54. x_signature.Features[i] = dataX + i;
  55. x_signature.Weights[i] = 1.0;
  56. }
  57. for (int i = 0; i < y_signature.n ; i++)
  58. {
  59. y_signature.Features[i] = dataY + i;
  60. y_signature.Weights[i] = 1.0;
  61. }
  62. double result = emd(&x_signature, &y_signature,
  63. simple_distance, 0, 0);
  64. delete [] x_signature.Features;
  65. delete [] y_signature.Features;
  66. delete [] x_signature.Weights;
  67. delete [] y_signature.Weights;
  68. return result;
  69. }