Mercurial > hg > match-vamp
comparison src/DistanceMetric.cpp @ 156:d6df9fe7b12f refactors
Implement distance metric selection (euclidean or cosine)
author | Chris Cannam |
---|---|
date | Thu, 29 Jan 2015 10:25:47 +0000 |
parents | b79151bb75af |
children | d6c1556fadd0 |
comparison
equal
deleted
inserted
replaced
151:246de093f0f1 | 156:d6df9fe7b12f |
---|---|
37 DistanceMetric::calcDistance(const vector<double> &f1, | 37 DistanceMetric::calcDistance(const vector<double> &f1, |
38 const vector<double> &f2) | 38 const vector<double> &f2) |
39 { | 39 { |
40 double d = 0; | 40 double d = 0; |
41 double sum = 0; | 41 double sum = 0; |
42 double eps = 1e-16; | |
42 | 43 |
43 int featureSize = f1.size(); | 44 int featureSize = f1.size(); |
44 assert(int(f2.size()) == featureSize); | 45 assert(int(f2.size()) == featureSize); |
45 | 46 |
47 if (m_params.metric == Cosine) { | |
48 | |
49 double num = 0, denom1 = 0, denom2 = 0; | |
50 | |
51 for (int i = 0; i < featureSize; ++i) { | |
52 num += f1[i] * f2[i]; | |
53 denom1 += f1[i] * f1[i]; | |
54 denom2 += f2[i] * f2[i]; | |
55 } | |
56 | |
57 d = 1.0 - (num / (eps + sqrt(denom1 * denom2))); | |
58 | |
59 if (m_params.noise == AddNoise) { | |
60 d += 1e-2; | |
61 } | |
62 if (d > 1.0) d = 1.0; | |
63 | |
64 return d; // normalisation param ignored | |
65 } | |
66 | |
67 // Euclidean | |
68 | |
46 for (int i = 0; i < featureSize; i++) { | 69 for (int i = 0; i < featureSize; i++) { |
47 d += fabs(f1[i] - f2[i]); | 70 d += fabs(f1[i] - f2[i]); |
48 sum += fabs(f1[i]) + fabs(f2[i]); | 71 sum += fabs(f1[i]) + fabs(f2[i]); |
49 } | 72 } |
50 | 73 |