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]
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
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. –
'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