2014-01-11 66 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,它將使距離bacome NaN。我應該把分頻器變成1還是忽略它?或者還有另一種用於計算SIFT特徵的卡方算法?

回答

-1

檢查0並在計算方法中拋出異常。我看不出1除以1有什麼意義?

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

處理調用代碼中的異常。 (如果你指明你正在編程的語言,這將有所幫助。)

+0

所以我們不包括在計算? –

+0

如果你的分頻器是零,那麼我沒有看到它做任何數學意義做計算?因此,捕獲錯誤並向用戶顯示警告,指示輸入了無效參數。我不確定在什麼情況下Xi和Yi會相互對立?也許你需要驗證用戶界面層的輸入? – robnick

+0

我用它來計算2個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;