2017-09-11 5 views
0

J'ai essentiellement le problème de supprimer certaines valeurs et d'en conserver d'autres dans une cellule de cellules.Boucle conditionnelle pour filtrer les valeurs de contenu de cellule

Je crée une cellule appelée distances, puis je souhaite filtrer les valeurs en fonction des deux critères "blockade et blockadeouter". Je suis incapable de le faire avec les cellules initiales dans la cellule de distance restant vide, mais plus important encore, le filtrage ne fonctionne pas dans le sens où je vois des valeurs en dehors de la gamme spécifiée restant dans la cellule de distance.

Je veux stocker les coordonnées xinit, yinit, zinit pour les distances qui satisfont par la propriété range et stocker ces coordonnées dans le posx, posy, posz.

Je ne suis pas sûr de l'erreur que je commets. Toute aide est la bienvenue.

Merci

kb = 1.38065*10^(-23) ; %Boltzmann Constant 
amu = 1.660539040*10^-27; % atomic mass unit 
mRb= 85;%mass of Rubidium 85 
c = 299792458; % speed of light 
e=1.6021892*10^-19;%electron unit charge 
epsilon0 = 8.854 * 10^-12; 

%=============Minimum Allowable Distance/Blockade Radius===================== 
a = 12.8*10^-6; 
blockade =14*10^-6;%lower limit for filtering 
blockadeouter = blockade + a;%upper limit for filtering 

sigmax = 40; 
sigmay = 40; 
sigmaz = 0; 
%==================Number of Scan Steps==================================== 
npics =50; %number of iterations 
%=============Number of initial particles in the excitation volume in the MOT Stage=================== 
numberofparticles =100; 
%=============Creating a cell system for importing GPT Data into=========== 
distances = cell(npics,1);%Collecting all distances between particles 
posx = cell(npics,1); 
posy = cell(npics,1); 
posz = cell(npics,1); 

for n = 1 : 1 : npics 
    fprintf('%d ',n); 
    %Declaration of orgin for simulation 
    mux = 0; muy = 0; muz =0; 
    %Creating a x,y,z coordinate system for the ion 
    xinit = normrnd(mux,sigmax*10^-6,[1 numberofparticles]); 
    yinit = normrnd(muy,sigmay*10^-6,[1 numberofparticles]); 
    zinit = normrnd(muz,sigmaz*10^-6,[1 numberofparticles]); 

    for ii = 1 : 1 : numberofparticles 

     for jj = ii+1 : 1 : numberofparticles 

      distances{ii}{jj} = sqrt((xinit(ii) - xinit(jj)).^2 + (yinit(ii) - yinit(jj)).^2 + (zinit(ii) - zinit(jj)).^2); 

      if (distances{ii}{jj} >= blockade) && (distances{ii}{jj} <= blockadeouter) 
       posx{n}{jj} = xinit(jj); 
       posy{n}{jj} = yinit(jj); 
       posz{n}{jj} = 0; 
      end 

     end 
    end 
end % end of npics loop 

figure 
for ii = 1:1:length(distances) 
    trial{ii} = cell2mat(distances{ii,1}(1,:)); 
end 
trial = cell2mat(trial); 
grid on; 
title('Filtered Distances') 
hist(trial) 
+0

Plutôt que de lutter avec des réseaux cellulaires des tableaux de cellules, pourquoi ne pas utiliser des tableaux numériques 2-D réguliers et utiliser NaN pour indiquer les données manquantes (où vous utilisiez des tableaux vides [] avant)? Par exemple. initialiser quelque chose comme ceci 'distances = NaN (npics, numberofparticles);' et ensuite utiliser 'distances (ii, jj) = ...', et similaire pour 'posx',' posy' et 'posz'. – Justin

Répondre

0

Je ne sais pas quel était le problème avec l'instruction conditionnelle, mais je suis en mesure de résoudre le problème en procédant comme suit:

for ii = 1 : 1 : numberofparticles 

     for jj = ii+1 : 1 : numberofparticles 

      distances{ii}{jj} = sqrt((xinit(ii) - xinit(jj)).^2 + (yinit(ii) - yinit(jj)).^2 + (zinit(ii) - zinit(jj)).^2); 
      if distances{ii}{jj} > blockadeouter 
       distances{ii}{jj} = []; 
      end 

      if distances{ii}{jj} < blockade 
       distances{ii}{jj} = []; 
      else 
       posx{n}{jj} = xinit(jj); 
       posy{n}{jj} = yinit(jj); 
       posz{n}{jj} = zinit(jj); 
      end 

     end 
    end