2015-10-09 1 views
-1

J'ai un ensemble de données qui contient différents types de données comme il est indiqué ci-dessousUnresponsive boucle en Matlab

MMSI  Latitude Longitude Date  Time Time (decimal) 
277333444 59.8564  30.497  04-08-12 09:49 589 
241025000 37.3462  24.8713  04-08-12 09:49 589 
636012774 35.7931  28.7227  04-08-12 11:29 680 
248681000 36.9327  27.3042  04-08-12 11:52 703 
312847000 35.3429  28.5582  04-08-12 11:52 703 
239737000 36.4827  27.9405  04-08-12 11:52 703 
200   36.7672  34.6444  04-08-12 12:52 763 
237071900 36.7778  24.578  04-08-12 12:52 763 

et les données sont importées à partir d'un fichier csv. Dans les données d'exemple, l'heure est triée, mais dans les données, l'heure est mélangée. Pour les données, je veux calculer la distance entre deux points différents et obtenir ainsi les MMSI impliqués ainsi que les temps. J'ai écrit le code suivant, qui fait presque ce que j'ai décrit.

fid = fopen('vessel-movements-2.csv'); 
C = textscan(fid, '%f %f %f %f %f %s %s %s %f', 'HeaderLines', 1,  'Delimiter', ','); 
fclose(fid); 
iscell(C); 
M = cell2mat(C(:,1:5)); 

DateString = (C{1,7}); 
formatIn = 'dd-mm-yy'; 
P = datenum(DateString, formatIn); 
M = horzcat(M,P); 

Q = cell2mat(C(:,9)); 
M = horzcat(M,Q); 

a = M(:,6); 
b=unique(a); 

c = M(:,1); 
d = unique(c); 

lat = M(:,2); 
lon = M(:,3); 

time = M(:,7); 
TimeStamp = P+time; 
M = horzcat(M,TimeStamp); 

MM = sortrows(M,8); 

all(M(:,8) == MM(:,8)) 

for i = 1:length(MM(:,8)) 
    t = MM(i,8); 
    ind1 = i; 
    length(ind1); 
    lat1 = lat(ind1); 
    lon1 = lon(ind1); 

    while (t <= (MM(i,8)+5)) 
     for j = 2:length(d) 
      ind2 = j; 
      length(ind2); 
      lat2 = lat(ind2); 
      lon2 = lon(ind2); 
      w = MM(j,8);    
     end 

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


    if dis<=1 

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

Les index dans le script sont légèrement différentes de ce qu'elles devraient être des données présentées, mais il y a d'autres colonnes dans mes données, qui ne sont pas utilisés dans la boucle, donc pour une meilleure visualisation, je les ai laissés de l'échantillon. Il calcule correctement la distance pour la première fois, mais dans la boucle externe, le programme semble être à la traîne et fonctionner indéfiniment, mais sans aucun résultat. J'ai essayé le débogueur mais le résultat est le même. Je ne peux pas voir le problème et toute aide serait appréciée.

+1

Il ne semble pas que votre boucle 'while' modifie' t', donc il sera bloqué dans une boucle infinie. – excaza

+0

Il semble que dans les données d'échantillon, mais dans les données réelles, il y a beaucoup de valeurs de temps qui ont une différence de 1 ou moins de 5, donc la boucle 'while' devrait modifier' t' – vasouli

+3

't> (MM (i , 8) +5); 'ne change pas' t' – excaza

Répondre

0

Ceci n'est pas une réponse, mais un commentaire formaté. Je veux juste souligner que vos boucles sont très étranges et dysfonctionnelles. Ce que vous avez dans votre version actuelle, en fait, c'est:

for i = 1:length(MM(:,8)) %this should be size(MM,1) 
    ind1 = i; 
    lat1 = lat(ind1); 
    lon1 = lon(ind1); 

    ind2 = d; 
    lat2 = lat(ind2); 
    lon2 = lon(ind2); 
    w = MM(d,8); 
    t = MM(i,8)+5+1 

    dis = distance(lat1, lon1, lat2, lon2); 

    if dis<=1 
     contact = [ind1, ind2, t, w]; 
    end 
end 
+0

Je comprends que le code fait ce que vous dites et non ce que j'ai l'intention de faire. Mais qui a écrit la boucle while alors que sa condition est que la différence de temps est de 5 't <= (MM (i + 8) +5)' et pendant ce temps l'espace calcule la distance entre toutes les paires possibles de MMSIs ? – vasouli

+0

@vasouli Eh bien, ce serait un peu plus compliqué, et de toute façon une autre question tout à fait. Quoi qu'il en soit, la plupart des boucles pourraient être épargnées. Ce que je ne comprends pas, c'est pourquoi vous semblez avoir une boucle infinie: ça ne devrait pas se comporter ainsi. –