簡體   English   中英

C中的歐式距離計算

[英]Euclidean Distance Calculation in C

我嘗試使用以下代碼在PHP中計算歐幾里得距離,但所需時間非常長。 我想測試我是否會在C中執行相同的操作(如果這樣做會更快)。 輸入數據應從php傳遞,而所有其他數據均存儲在mysql數據庫中。 如何計算大約30,000個具有900個屬性的圖像的距離,該如何快速進行操作。 那么,如何使C中的計算比PHP中的計算更快呢? 我沒有用C語言編程,所以任何建議將不勝感激。

PHP中用於距離計算的查詢可以總結如下:

SELECT tbl_img.img_id,
       tbl_img.img_path,
       ((pow(($r[9]-coarsewt_1),2))+(pow(($r[11]-coarsewt_2),2))+ ... +(pow(($r[31]-coarsewt_12),2))+
        (pow(($r[36]-finewt_$wt1),2))+(pow(($r[38]-finewt_$wt2),2))+(pow(($r[40]-finewt_$wt3),2))+
        (pow(($r[43]-shape_1),2))+(pow(($r[44]-shape_2),2))+ ...  +(pow(($r[462]-shape_420),2))+
        (pow(($r[465]-texture_1),2))+(pow(($r[466]-texture_2),2))+ ... +(pow(($r[883]-texture_419),2))+(pow(($r[884]-texture_420),2)))
       as distance 
FROM tbl_img 
INNER JOIN tbl_coarsewt 
ON tbl_img.img_id=tbl_coarsewt.img_id 
INNER JOIN tbl_finewt 
ON tbl_img.img_id=tbl_finewt.img_id 
INNER JOIN tbl_shape 
ON tbl_img.img_id=tbl_shape.img_id 
INNER JOIN tbl_texture 
ON tbl_img.img_id=tbl_texture.img_id 
WHERE tbl_img.img_id>=1 AND tbl_img.img_id<=31930 
ORDER BY distance ASC LIMIT 6

您的問題不在於語言,就像Arash Kordi所說的那樣。 該SQL將由您的SQL服務器執行,並且由於使用了該算法,該服務器將成為您的瓶頸,而不是您編寫腳本的語言。如果切換到C,則不會有任何顯着的速度,除非您也更改策略。

優化的基本經驗法則:

  • 不要使用數據庫進行計算。 使用數據庫獲取相關數據,然后使用PHP或C進行計算。

  • (預先計算?)查找數組:分析數據,看看是否可以構建一個查找數組,例如pow()結果,而不是每次都重新計算每個值。 如果您有大量重復數據,這將很有幫助。

  • 避免序列化-您能否在數據的不同部分上並行運行腳本的多個實例以最大化吞吐量?

  • 考慮使用服務器端准備好的語句-它們可能會加快速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM