Mercurial > hg > match-vamp
comparison src/DistanceMetric.cpp @ 190:48f9c50587dc re-minimise
Print some info about scale range, so we can work out what scale factor to use
author | Chris Cannam |
---|---|
date | Thu, 26 Feb 2015 15:51:50 +0000 |
parents | af6120a32063 |
children | fa005e5e0953 |
comparison
equal
deleted
inserted
replaced
189:d4b3b5c2cb58 | 190:48f9c50587dc |
---|---|
20 #include <cmath> | 20 #include <cmath> |
21 #include <iostream> | 21 #include <iostream> |
22 | 22 |
23 using namespace std; | 23 using namespace std; |
24 | 24 |
25 //#define DEBUG_DISTANCE_METRIC 1 | 25 #define DEBUG_DISTANCE_METRIC 1 |
26 | 26 |
27 template <> uint8_t | 27 template <> uint8_t |
28 DistanceMetric::scaleIntoRange(double distance) | 28 DistanceMetric::scaleIntoRange(double distance) |
29 { | 29 { |
30 double scaled = m_params.scale * distance; | 30 double scaled = m_params.scale * distance; |
31 if (scaled < 0) scaled = 0; | 31 if (scaled < 0) { |
32 if (scaled > 255) scaled = 255; | 32 scaled = 0; |
33 } | |
34 if (scaled > MaxDistance) { | |
35 scaled = MaxDistance; | |
36 ++m_overcount; | |
37 } | |
33 return uint8_t(scaled); | 38 return uint8_t(scaled); |
34 } | 39 } |
35 | 40 |
36 template <> float | 41 template <> float |
37 DistanceMetric::scaleIntoRange(double distance) | 42 DistanceMetric::scaleIntoRange(double distance) |
44 { | 49 { |
45 return distance; | 50 return distance; |
46 } | 51 } |
47 | 52 |
48 DistanceMetric::DistanceMetric(Parameters params) : | 53 DistanceMetric::DistanceMetric(Parameters params) : |
49 m_params(params) | 54 m_params(params), |
55 m_max(0), | |
56 m_overcount(0) | |
50 { | 57 { |
51 #ifdef DEBUG_DISTANCE_METRIC | 58 #ifdef DEBUG_DISTANCE_METRIC |
52 cerr << "*** DistanceMetric: norm = " << m_params.norm | 59 cerr << "*** DistanceMetric: metric = " << m_params.metric |
60 << ", norm = " << m_params.norm | |
61 << ", noise = " << m_params.noise | |
62 << ", scale = " << m_params.scale | |
53 << endl; | 63 << endl; |
64 #endif | |
65 } | |
66 | |
67 DistanceMetric::~DistanceMetric() | |
68 { | |
69 #ifdef DEBUG_DISTANCE_METRIC | |
70 cerr << "*** DistanceMetric::~DistanceMetric: metric = " << m_params.metric | |
71 << ", norm = " << m_params.norm | |
72 << ", noise = " << m_params.noise; | |
73 #ifdef USE_COMPACT_TYPES | |
74 cerr << ", scale = " << m_params.scale; | |
75 cerr << "\n*** DistanceMetric::~DistanceMetric: max scaled value = " | |
76 << distance_print_t(m_max) | |
77 << ", " << m_overcount << " clipped" << endl; | |
78 #else | |
79 cerr << ", no scaling"; | |
80 cerr << "\n*** DistanceMetric::~DistanceMetric: max value = " | |
81 << distance_print_t(m_max) | |
82 << endl; | |
83 #endif | |
54 #endif | 84 #endif |
55 } | 85 } |
56 | 86 |
57 distance_t | 87 distance_t |
58 DistanceMetric::scaleValueIntoDistanceRange(double value) | 88 DistanceMetric::scaleValueIntoDistanceRange(double value) |
59 { | 89 { |
60 return scaleIntoRange<distance_t>(value); | 90 return scaleIntoRange<distance_t>(value); |
61 } | 91 } |
62 | 92 |
93 distance_t | |
94 DistanceMetric::scaleAndTally(double value) | |
95 { | |
96 distance_t dist = scaleIntoRange<distance_t>(value); | |
97 if (dist > m_max) m_max = dist; | |
98 return dist; | |
99 } | |
100 | |
63 distance_t | 101 distance_t |
64 DistanceMetric::calcDistance(const feature_t &f1, | 102 DistanceMetric::calcDistance(const feature_t &f1, |
65 const feature_t &f2) | 103 const feature_t &f2) |
66 { | 104 { |
67 double d = 0; | 105 double d = 0; |
86 if (m_params.noise == AddNoise) { | 124 if (m_params.noise == AddNoise) { |
87 d += 1e-2; | 125 d += 1e-2; |
88 } | 126 } |
89 if (d > 1.0) d = 1.0; | 127 if (d > 1.0) d = 1.0; |
90 | 128 |
91 return scaleIntoRange<distance_t>(d); // normalisation param ignored | 129 return scaleAndTally(d); // normalisation param ignored |
92 } | 130 } |
93 | 131 |
94 if (m_params.metric == Manhattan) { | 132 if (m_params.metric == Manhattan) { |
95 for (int i = 0; i < featureSize; i++) { | 133 for (int i = 0; i < featureSize; i++) { |
96 d += fabs(f1[i] - f2[i]); | 134 d += fabs(f1[i] - f2[i]); |
110 d += noise; | 148 d += noise; |
111 sum += noise; | 149 sum += noise; |
112 } | 150 } |
113 | 151 |
114 if (sum == 0) { | 152 if (sum == 0) { |
115 return scaleIntoRange<distance_t>(0); | 153 return scaleAndTally(0); |
116 } | 154 } |
117 | 155 |
118 double distance = 0; | 156 double distance = 0; |
119 | 157 |
120 if (m_params.norm == NormaliseDistanceToSum) { | 158 if (m_params.norm == NormaliseDistanceToSum) { |
138 } else { | 176 } else { |
139 | 177 |
140 distance = d; | 178 distance = d; |
141 } | 179 } |
142 | 180 |
143 return scaleIntoRange<distance_t>(distance); | 181 return scaleAndTally(distance); |
144 } | 182 } |