2

我有一个 exe,它返回一个包含 16 个元素的数组。我必须使用 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 个特征,现在我有 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。什么是计算它的有效和快速的方法?

4

1 回答 1

3

由于 php 很慢,您应该直接在 SQL 中执行此操作,如下所示:

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

请注意,我使用绝对范数而不是欧几里德范数,如果您对实际值不感兴趣(因为在具有有限维数的向量空间中,所有范数都是等价的),这没有区别。用于示例的 sqlite 不提供该SQUARE功能,并且一直编写(f1 - :f1) * (f1 - :f1)很烦人,所以我想这是一个不错的解决方案。

于 2013-04-15T16:07:41.427 回答