Bonjour,
J’essaie de positionner des particules les unes par rapport aux autres dans un matrice 3D cubique et je recherche leurs proches voisins.
Problème : j’utilise des boucles For qui me donnent de bons résultats mais qui prennent un temps fou.
Voila le script :L’idée, c’est que je prends chaque particule et je compare ces coordonnées avec toutes les autres particules. Et c’est long…
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 %determination des proches voisins % Les colonnes 4, 5 et 6 correspondent aux positions en x, y et z dans la matrice. f = 10; for I = 1:Npart for J=1:Npart if ((part(I,4) + part(I,5) + part(I,6) == part(J,4) + part(J,5) + part(J,6) + 1) || (part(I,4) + part(I,5) + part(I,6) == part(J,4) + part(J,5) + part(J,6) - 1)) && ((part(I,4) == part(J,4) && part(I,5) == part(J,5)) || (part(I,6) == part(J,6) && part(I,5) == part(J,5)) || (part(I,6) == part(J,6) && part(I,4) == part(J,4))) part(I,f)= J; f = f + 1; end if f == 16 break end end f = 10; end
J’ai essayé un truc plus propre :
(A = B = positions en x, y et z) (1 1 1 ; 1 1 2…)
Mais là, malgré la suppression d’une boucle le temps de calcul reste le même, voire légèrement plus long. Il semblerait que la fonction size soit à l’origine du ralentissement. Mais sans le Size, je ne vois pas comment ajouter les vecteurs qui ont des tailles différentes (de 3 à 6 voisins pour les particules).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 for i = 1:Ncailloux C = [(A(:,1)-B(i,1)) (A(:,2)-B(i,2)) (A(:,3)-B(i,3)) ]; H1 = (abs(C(:,1))+abs(C(:,2))+abs(C(:,3))) < 2; H2 = find(H1); G = abs(C(H2,1)+C(H2,2)+C(H2,3))==1 ; L5 = find(G); W = size(L5); Voisin(i,1:W(1)) = H2(L5); clear C G H1 H2 L5 W end
Merci de votre aide
Partager