[Positioner] Fix PosUtil::ss_square_distance()

The returned distance is now "averaged" to take into account the number
of measurements in the lists. The former behaviour would lead two
couples of measurement lists with a different number of measurement to
have non-comparable distances.
This commit is contained in:
Matteo Cypriani 2012-02-08 17:57:00 +01:00
parent dc0e56c0ec
commit e687aac741
1 changed files with 10 additions and 3 deletions

View File

@ -73,11 +73,19 @@ void PosUtil::complete_with_dummy_measurements(
* Both lists must have the same size and contain the same keys: * Both lists must have the same size and contain the same keys:
* you should call complete_with_dummy_measurements() before * you should call complete_with_dummy_measurements() before
* compute_ss_square_distance(). * compute_ss_square_distance().
*
* The distance between the two lists is computed by averaging the
* square distances between the elements of both lists, two by two.
* Therefore, it is not really an averaged square distance; you cannot
* divide it to obtain an euclidean distance. To do that, one would
* have to create a ss_distance() function that average the distances
* between the elements of the lists instead of the square distance.
*/ */
float PosUtil::ss_square_distance( float PosUtil::ss_square_distance(
unordered_map<string, Measurement> &measurements1, unordered_map<string, Measurement> &measurements1,
unordered_map<string, Measurement> &measurements2) unordered_map<string, Measurement> &measurements2)
{ {
assert(! measurements1.empty()) ;
assert(measurements1.size() == measurements2.size()) ; assert(measurements1.size() == measurements2.size()) ;
float distance = 0 ; float distance = 0 ;
@ -88,11 +96,10 @@ float PosUtil::ss_square_distance(
unordered_map<string, Measurement>::const_iterator i2 = unordered_map<string, Measurement>::const_iterator i2 =
measurements2.find(i1->first) ; measurements2.find(i1->first) ;
assert(i2 != measurements2.end()) ; assert(i2 != measurements2.end()) ;
distance += i1->second.ss_square_distance( distance += i1->second.ss_square_distance(i2->second) ;
i2->second) ;
} }
return distance ; return distance / measurements1.size() ;
} }