2013-04-15 122 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)一直都很烦人,所以我想这是一个不错的解决方案。