2014-01-11 8 views
1

Я пытаюсь реализовать хи-квадрат, который алгоритм:
реализации хи-квадрат, чтобы найти расстояние между функцией 2 SIFT

Distance= 1/2* Ei((Xi-Yi)^2/Xi+Yi) 
instead of euclidean distance which algorithm is: 
Distance= Sqrt(E(Xi-Yi)^2) 
in calculating distance between 2 SIFT feature (128 dimensional vector), 

моя проблема делитель в квадрате Чи может быть 0, и это сделает расстояние баком NaN. Должен ли я сделать делитель в 1 или игнорировать его? или был еще один алгоритм хи-квадрат для вычисления функции SIFT?

ответ

-1

Проверьте наличие 0 и введите исключение в свой метод расчета. Я не вижу, как разделение на 1 имеет смысл?

if ((Xi+Yi) == 0) 
    throw new Exception("bad divider") 

Обрабатывать исключение при вызове кода. (Помогло бы, если бы вы указали язык, на котором вы программируете.)

+0

так мы не включаем его в расчет? –

+0

Если ваш делитель равен нулю, то я не вижу, чтобы он делал математический смысл для вычисления? Таким образом, ловушка ошибки и отображение предупреждения пользователю, указав недействительные параметры были введены. Я не уверен, при каких обстоятельствах Xi и Yi будут равны друг другу? Возможно, вам нужно проверить входные данные на уровне пользовательского интерфейса? – robnick

+0

Я использую его для вычисления расстояния между двумя дескрипторами SIFT, поэтому часто бывает, что Xi + Yi равно нулю. –

0

Если значения неотрицательны (например, значения гистограммы), единственный путь к нулю делителя - Xi == Yi == 0, и поэтому расстояние для этого я 0.
таким образом, вы только должны проверить на ноль:

sum = 0; 
for(i....) { 
    auto div = Xi + Yi; 
    if(div == 0) continue; 
    sum += (Xi-Yi)*(Xi-Yi)/div; 
} 
return sum/2;