2017-10-18 4 views
0

J'ai le problème suivant. Considérant que j'ai 4 particules dans une zone.matlab find() indices de cellules pour particule, double 4D

Les particules traversent cette zone avec une certaine vélocité. À un moment donné, cependant, je veux savoir dans quelle cellule se trouve une telle particule.

Mon exemple de code ressemble à ceci:

x = -10:1:10; % area 
y = -10:1:10; 

particle = zeros(1,2,1,4); % 4 Particle 
particle(1,1,1,1) = 9.5; % x-position of the first particle 
particle(1,2,1,1) = 9.5; % y-position of the first particle 
particle(1,1,1,2) = 7.25; 
particle(1,2,1,2) = 8.5; 
particle(1,1,1,3) = 6.25; 
particle(1,2,1,3) = 7.5; 
particle(1,1,1,4) = 5.25; 
particle(1,2,1,4) = 6.5; 

for xp=1:size(particle,3) 
    for yp=1:size(particle,4) 
     if particle(1,1,xp,yp) < x(1) 
      cell_x = 1; 
     elseif particle(1,1,xp,yp) > x(end) 
      cell_x = size(x,2); 
     else 
      cell_x = find(x <= particle(1,1,xp,yp),1,'last'); 
     end 
     if particle(1,2,xp,yp) < y(1) 
      cell_y = 1; 
     elseif particle(1,2,xp,yp) > y(end) 
      cell_y = size(y,2); 
     else 
      cell_y = find(y <= particle(1,2,xp,yp),1,'last'); 
     end 
    end 
end 

Mon code prend trop de temps pour un certain nombre de 52 x 10 particules. Je voulais omettre une boucle for en entrant yp comme un tableau dans particle(1,2,xp,yp), mais malheureusement la fonction find() ne peut pas gérer les tableaux. Ou ai-je tort? Avez-vous une idée de comment le faire fonctionner beaucoup plus vite pour que j'ai

cell_x = [20,18,17,16] 
cell_y = [20,19,18,17] 
+0

Pouvez-vous s'il vous plaît expliquer pourquoi vous êtes Chercher 'trouver (x <= particule (1,1, xp, yp), 1, 'dernier')' pour l'index et ne pas appliquer une transformation de la position x sauvegardée. E.g: Dans votre exemple 'x' prend des valeurs comprises entre -10 et 10 par incréments de 1, vous pouvez simplement utiliser floor de la valeur sauvegardée et la décaler pour obtenir l'index? De cette façon, vous omettez une boucle. Vous avez juste besoin de savoir quelle transformation sur la coordonnée 'x' ou' y' sauvegardée vous devez effectuer pour obtenir l'index – Irreducible

+0

Dans mon code original, j'ai 'x = linspace (-0.0800,0.0134, nx)' et mon étape est en fonction de 'dx = (0.08 + 0.0134)/(nx-1);' avec 'nx = 100'. Donc je ne vois pas l'utilisation du sol. Mais je peux aussi avoir tort. –

+0

'linspace' produit des valeurs x linéairement espacées, vous n'avez donc besoin de connaître que la taille de l'échelon et le minimum de votre tableau, voir la fin de ma réponse. – Irreducible

Répondre

0

Un exemple de code à mon commentaire

x = -10:1:10; % area x 

%input data 
Numberofdata=4; 
saved_x=[9.5 7.25 6.25 5.25]; 

%conversion from value to index 
idx_x1=floor(saved_x)+abs(min(x))+1; 
%search for index 
for k=1:Numberofdata 
idx_x2(k,1)=find(x <=saved_x(k),1,'last'); 
end 

% Output 
[idx_x1' idx_x2] 

20 20 
18 18 
17 17 
16 16 

Je sais qu'il est appliqué à un vecteur et non une matrice cependant, vous pouvez appliquer cette transformation à n'importe quelle dimension de votre matrice.

Dans le cas où vous ne changez pas x par pas de 1 mais quelque chose comme ça:

x=min_x:dx:max_x 

alors vous devez faire ce qui suit:

idx_x1=floor(saved_x/dx)+abs(min_x/dx)+1; 
+0

C'est vraiment génial. Je vous remercie. Je dois le tester maintenant. –