in pdq/java/src/main/java/pdqhashing/utils/MatrixUtil.java [50:99]
public static float torben(float[][] m, int numRows, int numCols) {
int n = numRows * numCols;
int midn = (n + 1) / 2;
int i, j, less, greater, equal;
float min, max, guess, maxltguess, mingtguess;
min = max = m[0][0];
for (i = 0; i < numRows; i++) {
for (j = 0; j < numCols; j++) {
float v = m[i][j];
if (v < min) min = v;
if (v > max) max = v;
}
}
while (true) {
guess = (min + max)/2;
less = 0; greater = 0; equal = 0;
maxltguess = min;
mingtguess = max;
for (i = 0; i < numRows; i++) {
for (j = 0; j < numCols; j++) {
float v = m[i][j];
if (v <guess) {
less++;
if (v > maxltguess) maxltguess = v;
} else if (v > guess) {
greater++;
if (v < mingtguess) mingtguess = v;
} else equal++;
}
}
if (less <= midn && greater <= midn)
break;
else if (less>greater)
max = maxltguess;
else
min = mingtguess;
}
if (less >= midn) {
return maxltguess;
} else if (less+equal >= midn) {
return guess;
} else {
return mingtguess;
}
}