1 /* 2 * Copyright 2016 E-Tool, Inc. 3 */ 4 5 #ifndef distance_h 6 #define distance_h 7 #include <math.h> 8 #include <vector> 9 using std::vector; 10 11 #define max(a,b) (a>b?a:b) 12 #define min(a,b) (a<b?a:b) 13 14 class Distance { 15 public: 16 static double euclidean_distance(double x1,double y1,double x2,double y2) { 17 return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 18 } 19 static double euclidean_distance(double x1, double y1, double z1, double x2, double y2, double z2) { 20 return sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2)+(z1-z2)*(z1-z2)); 21 } 22 static double euclidean_distance(vector<double> x, vector<double> y) { 23 double result = 0; 24 for (int i = 0;i < x.size();i++) { 25 result += (x[i]-y[i])*(x[i]-y[i]); 26 } 27 return sqrt(result); 28 } 29 static double manhattan_distance(double x1, double y1, double x2, double y2) { 30 return abs(x1 - x2) + abs(y1 - y2); 31 } 32 static double manhattan_distance(vector<double> x, vector<double> y) { 33 double result = 0; 34 for (int i = 0;i < x.size();i++) { 35 result += abs(x[i] - y[i]); 36 } 37 return result; 38 } 39 static double chebyshev_distance(double x1, double y1, double x2, double y2) { 40 return max(abs(x1 - x2) ,abs(y1 - y2)); 41 } 42 static double chebyshev_distance(vector<double> x, vector<double> y) { 43 double result=-1; 44 for (int i = 0;i < x.size();i++) { 45 result = max(result, abs(x[i] - y[i])); 46 } 47 return result; 48 } 49 static double minkowski_distance(vector<double> x, vector<double> y,int p) { 50 double result = 0; 51 for (int i = 0;i < x.size();i++) { 52 result += pow(abs(x[i]-y[i]),p); 53 } 54 return pow(result,1/p); 55 } 56 /* 57 * Standardized Euclidean distance 58 */ 59 static double standardized_euclidean_distance(vector<double> x, vector<double> y) { 60 double result = 0; 61 for (int i = 0;i < x.size();i++) { 62 double r=(x[i]+y[i])/2; 63 double s = (x[i]-r)*(x[i]-r)+(y[i]-r)*(y[i]-r); 64 result += (x[i]-y[i])*(x[i]-y[i]) / s; 65 } 66 return sqrt(result); 67 } 68 static double information_entropy(vector<double> p) { 69 double result=0; 70 for (int i = 0;i < p.size();i++) { 71 result -= p[i] * (log(p[i])/log(2)); 72 } 73 return result; 74 } 75 }; 76 77 #endif
时间: 2024-10-17 15:10:41