2013-04-15 270 views
2

我有一個exe文件,它返回一個16elements的數組。我必須將這個數組傳遞給Mysql,使用php來計算歐幾里得距離。我在MySQL中的表格是在表單中。計算平方歐幾里德距離

id |img_id | features_1|features_2|features_3|features_4|features_5|features_6|features_7|...upto features_16 
    1 1  0.389  0.4567  0.8981  0.2345 
    2 2  0.9878  0.4567  0.56122  0.4532   
    3 3   
    4 4   
    ...................... 

所以我有16個功能的每個圖像,現在我有30,000圖像是img_id是高達30,000。我必須從數據庫中的數據中計算通過php傳遞的exe數組中的歐幾里德距離,並返回歐幾里得距離最小的6個圖像的img_id。即假設我有一個EXE A [0.458,0.234,0.4567,0.2398]數組,我必須計算每個img_id與這個數組的距離,即對於img_id = 1,距離將是((0.458-0.389)^ 2 +(0.234- 0.4567)^ 2 +(0.4567-0.8981)^ 2 +(0.2398-0.2345)^ 2)我必須對所有30,000張圖像重複此過程並返回距離最近的6個img_id。什麼是有效和快速的計算方法?

+0

手動。你的桌子似乎沒有爲它設置。是'id'' auto_increment'?做這樣的事情,你真的應該有一行每個圖像與'功能'是更具描述性和獨立的列。 – Jon

+0

是的id是自動增量。如果我將功能保存在單獨的列中而不是單獨的行,會更容易嗎? – user1583647

+0

是的,爲了以任何精度進行這種類型的計算,一個圖像的所有特徵都需要用它們自己的列進行設置。 – Jon

回答

2

由於PHP是緩慢的,你應該直接在這樣的SQL這樣做:

SELECT * FROM tablename 
ORDER BY ABS(f1 - :f1) + ABS(f2 - :f2) + ... DESC 
LIMIT 6; 

請注意,我用的絕對標準,而不是歐幾里德範數沒有什麼區別,如果你不感興趣的實際值(因爲在具有有限維度的向量空間中,所有規範都是等價的)。 sqlite for eample不提供SQUARE函數,而且編寫(f1 - :f1) * (f1 - :f1)一直都很煩人,所以我想這是一個不錯的解決方案。