【问题标题】:Fill remainder of data set with nans in Matlab在 Matlab 中用 nans 填充数据集的其余部分
【发布时间】:2013-06-22 07:33:19
【问题描述】:

我有一个数据集,其中包含给定时间段的一些测量值:

Jday = datenum('2010-01-01 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
    datenum('2011-07-31 23:00','yyyy-mm-dd HH:MM');
Dat = rand(length(Jday),1);

我现在想确保数据集涵盖给定调查年份(上述 2010 年和 2011 年)的整个年度周期。所以,假设数据是每小时测量一次,我怎么能用 NaN 填充数据集的剩余时间,以便最终变量的长度等于:

Jday = datenum('2010-01-01 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
    datenum('2011-12-31 23:00','yyyy-mm-dd HH:MM');

例如,在 2011-07-31 23:00 和 2011-12-31 23:00 之间,Dat 在哪里会有 NaN?

【问题讨论】:

  • 普通的还是蒜味的?

标签: matlab nan


【解决方案1】:

如果你有R2013a,那么你也可以使用padarray()

B = padarray(A,padsize, NaN, 'post')

注意:如果您希望合并两组日期,例如A 和 B,其中不失一般性 A 包括 B,那么您可能有 a_n ismember() 和逻辑索引,甚至是accumarray()

【讨论】:

    【解决方案2】:

    如果你确定数据只需要在末尾填充NaN,你可以简单地使用:

    pad_length = length(Jday) - length(Dat);
    pad = ones(pad_length,1)*NaN;
    Dat = [Dat;pad];
    

    【讨论】:

      【解决方案3】:

      您可以就地扩展数组以填充末尾或使用ismember 调整它。假设你有这个。

      AllDates = datenum('2010-01-01 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
          datenum('2011-12-31 23:00','yyyy-mm-dd HH:MM');
      Dates = datenum('2010-01-01 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
          datenum('2011-07-31 23:00','yyyy-mm-dd HH:MM');
      Dat = rand(length(Jday),1);
      

      如果您只是在末尾添加 NaN(也就是说,您知道 Dates 匹配 AllDates 中的前 n 个点),您可以使用对不存在的元素的简单赋值来扩展数组。

      Dat(end+1:numel(AllDates)) = NaN;
      

      如果您需要识别任意位置的漏洞,您可以使用ismember 将您的观察结果放入与较大日期集匹配的数组中。

      Dat2 = NaN(size(AllDates));
      [tf,ix] = ismember(Dates, AllDates);
      if ~all(tf);  error('Some dates not in reference set');  end
      Dat2(ix) = Dat;
      

      顺便说一句,您可能想使用numel 而不是length。它更笼统;如果您有二维数组,length 可能会给您带来问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-13
        • 1970-01-01
        • 2021-04-05
        • 1970-01-01
        • 2017-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多