EMDDistanceSingle.cpp 2.0 KB

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