2013-04-15 3 views
2

J'ai un exe qui retourne un tableau de 16éléments. Je dois passer ce tableau à Mysql en utilisant php pour calculer la distance euclidienne. Ma table en MySQL est dans le formulaire.Calcul de la distance Euclidienne Squared

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   
    ...................... 

J'ai donc 16 caractéristiques pour chaque image et maintenant je 30.000 images est-img_id est jusqu'à 30.000. Je dois calculer la distance euclidienne du tableau d'exe qui est passé par php avec les données dans la base de données et retourner le img_id des 6 images dont la distance euclidienne est minimale. Supposons que j'ai un tableau de l'exe A [0.458,0.234,0.4567,0.2398] Je dois calculer la distance de chaque img_id avec ce tableau ie pour img_id = 1 la distance sera ((0.458-0.389)^2 + (0.234- 0.4567)^2 + (0.4567-0.8981)^2 + (0.2398-0.2345)^2) et je dois répéter ce processus pour toutes les 30.000 images et retourner le 6 img_id qui a le moins de distance. Quel est le moyen efficace et rapide pour le calculer?

+0

À la main. Votre table ne semble pas configurée pour cela. Est-ce que 'id'' auto_increment'? Pour faire ce genre de chose, vous devriez vraiment avoir une ligne pour chaque image avec les 'features' étant des colonnes plus descriptives et séparées. – Jon

+0

Oui, l'identifiant est un incrément automatique. Est-ce que ce sera plus facile si je sauvegarde les fonctionnalités dans des colonnes séparées plutôt que des lignes séparées? – user1583647

+0

Oui, pour effectuer ce type de calcul avec une précision quelconque, toutes les caractéristiques d'une image doivent être configurées avec leur propre colonne. – Jon

Répondre

2

Puisque php est lent, vous devriez le faire directement dans le SQL comme ceci:

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

Notez que je la norme absolue au lieu de la norme euclidienne qui ne fait aucune différence si vous n'êtes pas intéressé par le réel valeurs (parce que dans les espaces vectoriels de dimension finie, toutes les normes sont équivalentes). sqlite pour eample ne fournit pas la fonction SQUARE et l'écriture (f1 - :f1) * (f1 - :f1) tout le temps est anoying, donc je suppose que c'est une bonne solution.

Questions connexes