public void queryThread() { int shift = 0; lock (lockObject) { shift = shifts++; } for (int k = shift; k < task.queryNames.Count; k += threadNum) { SISC query = new SISC(); query.extract(task.queryPaths[k]); for (int i = 0; i < end - start; ++i) { Score score = new Score(); score.index = start + i; score.score = SISC.dist(query, datasets[i]); scores[k].Add(score); } ++progress; Console.Write("Progress: " + (100.0 * progress / task.queryNames.Count).ToString("0.00") + "%\r"); } lock (lockObject) { --shifts; } }
public static double dist(SISC a, SISC b) { double dist = 0.0; for (int i = 0; i < a.histogram.Count; ++i) { double d = 1e100; for (int j = 0; j < b.histogram.Count; ++j) { double t = 0.0; for (int ang = 0; ang < binAngle; ++ang) { for (int nor = 0; nor < binNorm; ++nor) { double g = a.histogram[i][ang, nor]; double h = b.histogram[j][ang, nor]; t += (g - h) * (g - h) / (g + h + 0.001); } } d = Math.Min(d, t); } dist += d; } return(dist); }