计算mysql中的欧几里德距离

时间:2013-04-15 06:37:02

标签: php mysql euclidean-distance

我有一个返回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个功能,现在我有30,000张图片,img_id高达30,000张。我必须计算数组的欧几里德距离,该数据通过php与数据库中的数据一起传递,并返回欧几里德距离最小的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。我编写了以下存储过程,但它只返回img_id NULL。

如果有任何快速方法可以执行此操作,请提及。

create procedure sp_euclideandistance(feature1 double,feature2 double,feature3 double,feature4 double,feature5 double,feature6 double,feature7 double,feature8 double,feature9 double,feature10 double,feature11 double,feature12 double,feature13 double,feature14 double,feature15 double,feature16 double)
 Begin
  Declare i int;
  Declare distance double;
  Declare img_id int;
  Declare features_1 double;
  Declare features_2 double;
  Declare features_3 double;
  Declare features_4 double;
  Declare features_5 double;
  Declare features_6 double;
  Declare features_7 double;
  Declare features_8 double;
  Declare features_9 double;
  Declare features_10 double;
  Declare features_11 double;
  Declare features_12 double;
  Declare features_13 double;
  Declare features_14 double;
  Declare features_15 double;
  Declare features_16 double;
  Set i=92303;
  Set distance=0.000;

  create temporary table temptbl_dist(img_id int,distance int);

  while(i<124232)
  do

    select img_id,features_1,features_2,features_3,features_4,features_5,features_6,features_7,features_8,features_9,features_10,features_11,features_12,features_13,features_14,features_15,features_16 INTO img_id,features_1,features_2,features_3,features_4,features_5,features_6,features_7,features_8,features_9,features_10,features_11,features_12,features_13,features_14,features_15,features_16  from tbl_features where img_id=i;

    Set distance=((feature1-features_1)^2)+((feature2-features_2)^2)+((feature3-features_3)^2)+((feature4-features_4)^2)+((feature5-features_5)^2)+((feature6-features_6)^2)+((feature7-features_7)^2)+((feature8-features_8)^2)+((feature9-features_9)^2)+((feature10-features_10)^2)+((feature11-features_11)^2)+((feature12-features_12)^2)+((feature13-features_13)^2)+((feature14-features_14)^2)+((feature15-features_15)^2)+((feature16-features_16)^2);

    insert into temptbl_dist values (i,distance);

    Set i=i+1;


  end while;
  select img_id from temptbl_dist order by distance asc limit 6;
  drop table temptbl_dist;

End

0 个答案:

没有答案
相关问题