Bonjour,
Je sais que la communauté MySQL est pas mal développée et je souhaiterai avoir votre aide concernant un problème qui peut être résolu sur n'importe quel type de BDD :
Je souhaiterai trouver, pour un point donné de la table courante, son plus proche voisin dans la table de référence.
Pour cela je recherche le plus proche voisin en terme de distance euclidienne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 CREATE TABLE table_courante(id_point serial PRIMARY KEY,id_image INTEGER,x_image FLOAT,y_image FLOAT) CREATE TABLE table_ref(id_point serial PRIMARY KEY,id_image INTEGER,x_image FLOAT,y_image FLOAT).
(x-y)² * (x-y)². Dans cet exemple, le vecteur est à 2 dimensions (x et y) mais dans ma vraie table il s'agit d'un vecteur à 64 dimensions (c'est un point d'intérêt avec 64 descripteurs
ex :table_ref.desc_0 - table_courante.desc_0) * (table_ref.desc_0 - table_courante.desc_0) + (table_ref.desc_1 - table_courante.desc_1) + etc... )
j'aimerais que ma requête retourne l'id du point de l'image courant et l'id du point de l'image de référence pour laquelle la distance est la plus petite, et ceux pour l'ensemble de mes points courants.
Actuellement je suis capable de faire ça :
et je fais une boucle ou XXX prend toutes les valeurs de mon id du point courant (0, 1, 2 ...N)
Code : Sélectionner tout - Visualiser dans une fenêtre à part select table_courante.id_point,table_ref.id_point ,((table_ref.x-table_courante.x)*(table_ref.x-table_courante.x) + (table_ref.y-table_courante.y)*(table_ref.y-table_courante.y)) AS distance FROM table_ref, table_courante WHERE table_courante.id_point=XXX ORDER BY distance LIMIT 1
Mais cette requête prend 3 secondes pour comparer 2 images.. or j'ai 25 images à la sec.. et je dois être capable de faire du temps réel..
Je souhaiterais donc trouver un moyen de ne pas faire de boucle, et /ou trouver une requête complètement différente ou là requête prendrai quelques dizaines de ms maximum. A terme la table de ref contiendra des milliers de points..
ATTENTION : ce n'est pas parce que l'id du point de l'image courante = l'id du point de ref qu'il s'agit du même point. Cela n'a rien à voir, ils sont chacun sur 2 images différentes
J'espère que j'ai été clair
Merci d'avance pour votre aide
PS : je débute, Be nice
PPS :
J'ai déjà essayé les requete du type fonctions de fenêtrage rank() OVER PARTITION BY ... ça prend 9000 ms ..
Partager