2

16 要素の配列を返す exe があります。ユークリッド距離を計算するには、php を使用してこの配列を Mysql に渡す必要があります。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 の機能があり、img_id が最大 30,000 である 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 を返す必要があります。それを計算するための効率的かつ迅速な方法は何ですか?

4

1 に答える 1

3

PHP は遅いので、次のように SQL で直接これを行う必要があります。

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

実際の値に関心がない場合は、ユークリッド ノルムの代わりに絶対ノルムを使用したことに注意してください (有限次元のベクトル空間ではすべてのノルムが同等であるため)。sqlite for example はそのSQUARE機能を提供しておらず、常に書くのは面倒(f1 - :f1) * (f1 - :f1)なので、これは良い解決策だと思います。

于 2013-04-15T16:07:41.427 に答える