2015-10-13 1 views
-1

Je souhaite créer une boucle while, imbriquée dans une boucle for dans Matlab afin de trouver la distance entre différentes paires dans les données. Mes données ont la forme suivanteInfini tout en étant imbriqué dans une boucle for dans matlab

ID lon  lat  time 
    1 33.56 40.89 803 
    2 32.45 41.03 803 
    3 35.78 39.85 803 
    2 33.04 40.21 804 
    3 36.89 40.23 804 
    2 33.98 39.33 806 
    2 33.67 39.73 809 
    3 37.02 40.77 809 

lon et lat sont coordonnées géographiques. Dans la boucle for, je veux prendre la première ligne de la matrice et ensuite dans la boucle while vérifier toutes les autres lignes et calculer la distance entre les paires tant que la condition dans le while est true. Ce que je veux dire c'est que pour la première rangée je veux que le programme calcule la distance entre les paires 1-2, 1-3 à l'heure 803, puis la distance 1-2, 1-3 à l'heure 803 encore. Quand j'incrémente l'étape dans la boucle for par 1, encore une fois, le programme devrait calculer la distance entre les paires 2-3 à 803, puis 2-3 à 804 et ainsi de suite, etc. Pour ce faire, je l'ai écrit la boucle for comme ci-dessous:

for ii = 1:length(MM(:,4)) 
    t = MM(ii,4); 
    ind1 = ii; 
    length(ind1); 
    lat1 = lat(ind1); 
    lon1 = lon(ind1); 
    jj = ii +1; 

    while (t <= (MM(ii,4)+5)) 
     for jj = 2:length(MM(:,4)) 
      ind2 = jj; 
      length(ind2); 
      lat2 = lat(ind2); 
      lon2 = lon(ind2); 
      w = MM(jj,4); 
     end 

     dis = distance(lat1, lon1, lat2, lon2); 
     t = t + 1; 
    end 


    if dis <= 1 

     [contact] = [ind1, ind2, t, w]; 
    end 

end 

Avec cette boucle for je reçois une boucle infinie while. Ma question est pourquoi est-ce que j'obtiens cette boucle infinie while et comment suis-je censé faire fonctionner comme je l'ai décrit?

+1

[Utilisez le débogueur] (http://www.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features.html) pour parcourir le code et voir ce qui se passe dans votre boucle. – excaza

+0

J'ai utilisé le débogueur et je vois que le programme ne fonctionne que pour la première valeur de la boucle 'while'. Après cela, il va dans une boucle infinie et il ne change aucune valeur dans le 'alors' – vasouli

+0

Alors vous devez déterminer pourquoi les valeurs ne sont pas modifiées. Peut-être que vous pouvez imprimer certaines valeurs de clé, soit dans le terminal ou au fichier. Par exemple, vous voudrez peut-être imprimer chaque hundreth ou tousand 't'? Il est difficile pour nous de dire puisque nous n'avons pas maintenant la gamme attendue. Je ne pense pas vraiment que ce soit une question pour SO. C'est plutôt une chose privée entre vous et le débogueur;). – patrik

Répondre

1

J'ai finalement trouvé la réponse. Je l'affiche ici pour un usage futur.

for ii = 1:length(MM(:,4)) 
    t = MM(ii,4); 
    ind1 = ii; 
    length(ind1); 
    lat1 = lat(ind1); 
    lon1 = lon(ind1); 
    jj = ii + 1; 

    while (MM(jj,4) - t <= 5) 

      ind2 = jj; 
      length(ind2); 
      lat2 = lat(ind2); 
      lon2 = lon(ind2); 
      dis = distance(lat1, lon1, lat2, lon2); 

      if dis <= 1 
       contact = [MM(ind1,1), MM(ind2,1), t, MM(jj,4)] 

      else 
       fprintf('There is no distance smaller than 1km\n') 
      end 

      jj = jj + 1; 
    end 

end 

Comme il semble que la boucle for imbriquée dans le while était faux et sans aucune utilité. Le deuxième problème était la condition dans le while. La comparaison que j'ai faite précédemment dans la condition while a été écrite à rebours et n'avait aucune signification. Et le troisième problème était l'instruction if. En mettant l'instruction if dans la boucle while, j'ai eu le résultat dans le contact.