【发布时间】:2015-10-10 06:43:43
【问题描述】:
我有一个包含不同类型数据的数据集,如下所示
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
并且数据是从 csv 文件中导入的。在样本数据中,时间是排序的,但在数据中,时间是混合的。对于数据,我想计算两个不同点之间的距离,并因此获得所涉及的 MMSI 以及时间。我已经编写了以下代码,它几乎完成了我所描述的。
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
脚本中的索引与显示数据中的索引略有不同,但我的数据中还有其他列未在循环中使用,因此为了更好地可视化,我将它们从示例中删除。它第一次正确计算了距离,但是在外循环中,程序似乎滞后并永远运行,但没有任何结果。我尝试了调试器,但结果是一样的。我看不到问题,我们将不胜感激。
【问题讨论】:
-
你的
while循环好像不是在修改t,所以会卡在一个无限循环中。 -
在样本数据中似乎是这样,但在实际数据中,有很多时间值相差1或小于5,所以
while循环应该修改t -
t > (MM(i,8)+5);不变t -
@vasouli 正如 excaza 所说,在 while 循环中,您应该有一些写为
t=....的行,因此您可以更改 t 的值。 -
我尝试用
t=t+1;增加t并使用它而不是t>(MM(i,8)+5);,但这似乎根本没有效果。它仍然卡在无限循环中