【问题标题】:Unresponsive for loop in matlab [duplicate]matlab中的for循环无响应[重复]
【发布时间】: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 &gt; (MM(i,8)+5); 不变 t
  • @vasouli 正如 excaza 所说,在 while 循环中,您应该有一些写为 t=.... 的行,因此您可以更改 t 的值。
  • 我尝试用t=t+1; 增加t 并使用它而不是t&gt;(MM(i,8)+5);,但这似乎根本没有效果。它仍然卡在无限循环中

标签: matlab loops for-loop


【解决方案1】:

这不是答案,而是格式化的评论。我只想指出,您的循环非常奇怪且功能失调。您当前版本中的内容实际上是这样做的:

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

【讨论】:

  • 我了解代码执行您所说的操作,而不是我打算执行的操作。但是谁来编写 while 循环,它的条件是时间差为 5 t&lt;=(MM(i+8)+5) 并且对于那个时间空间计算所有可能的 MMSI 对之间的距离?
  • @vasouli 好吧,那会更复杂一些,无论如何都是另一个问题。无论如何,大多数循环都可以幸免。我不明白为什么你似乎得到了一个无限循环:它不应该那样做。
猜你喜欢
  • 2020-10-18
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多