for structure with structure + matlab

时间:2014-04-02 19:50:13

标签: matlab for-loop data-structures

我有一个名为sacfile的结构,其中包含各种站点的数据(sta1-sta6)。 sacfile进一步增加到日增量(sacfile.day,每个站),并进一步增加到每天的每小时增量(sacfile.day.hour)。我想循环每一天,然后每个小时进行每个站点的比较(即第032天循环到sta1 hr 1,比较sta2 hr 1,sta3 hr 1,sta4 hr1,sta5 hr1,sta6 hr 1,依此类推等到那一天的所有时间,然后进入第二天,等等。你明白了。工作站是在sacfile.sta中定义的。有没有人对我如何能做到这一点有任何建议?

*我只想循环播放电台的当天和小时,然后转到后续的日和小时。我不想交叉比较不同的日子和时间。这对循环很重要。

我尝试了以下内容:

      for i = 1:length(sacfile)
          for j = 1:length(sacfile(i,1).day)
              for h = 1:length(sacfile(i,1).day.hour)

但似乎每个小时都在循环。这是否有效,我怎么能确定它在正确的日子里循环,即sta1的第1天与sta2的第1天相同。

以下是其中一个结构的示例:

        name: '2013.032.00.00.00.0000.TA.POKR..BHE.sac'
        date: '31-Mar-2014 12:25:33'
        bytes: 11949036
        isdir: 0
        datenum: 7.3569e+05
        net: 'TA'
        sta: 'POKR'
        loc: ''
        comp: 'BHE'
        day: [1x1 struct]
        data: [2987101x1 double]
        time: [1x2987101 double]
        header: [1x1 struct]

唯一相关的是net,sta,loc,comp,day和data。 net,sta,loc,comp是文件的关键标识字段。名称是文件的名称。 Day将数据分解为几小时。合理?

1 个答案:

答案 0 :(得分:0)

如果我很好地理解了您的问题,那么extractfield()fieldnames()函数应该会有所帮助。

fields = fieldnames(sacfile);

for i = 1:numel(fields)
    b = extractfield(sacfile.(fields{i}).day, 'day3');
    c(i) = extractfield(b{1}.hour, 'hour_x');
end

函数extractfield()返回包含结构而不是结构本身的1x1单元格。这就是我做b{1}

的原因