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 :
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
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…

J’ai essayé un truc plus propre :

(A = B = positions en x, y et z) (1 1 1 ; 1 1 2…)

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

Merci de votre aide