2013-04-15 13 views
2

나는 16elements.I의 배열을 반환하는 EXE가 MySQL에서 유클리드 distance.My 테이블을 계산하는 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 개의 이미지가 있으며, 최대 30,000 개의 이미지가 있습니다. 데이터베이스에서 datas와 함께 php를 통과 한 exe로부터 배열의 유클리드 거리를 계산하고 유클리드 거리가 최소 인 6 개의 이미지 중 img_id를 반환해야합니다. 즉, 내가 exe [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; 

주 값 (유한 차원의 벡터 공간에서는 모든 표준이 동일하기 때문에). eample에 대한 sqlite는 SQUARE 함수를 제공하지 않으며 항상 (f1 - :f1) * (f1 - :f1)을 작성하는 것이 anoying이므로 좋은 해결책이라고 생각합니다.

관련 문제