用Matlab中的NAN填充数据集的剩余部分

用Matlab中的NAN填充数据集的剩余部分,matlab,nan,Matlab,Nan,我有一个数据集,其中包含给定时间段内的一些测量值: 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-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?

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

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

如果您有R2013a,则还可以使用
padarray()


注意:如果您希望采用两组日期的并集,例如a和B,其中a包括B,而不丧失一般性,那么您可能有a\n您可以在适当的位置展开数组以填充结尾或用
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(也就是说,您知道日期与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
。它更一般<代码>长度如果使用二维数组,可能会出现问题。

普通数组还是大蒜数组?
Dat2 = NaN(size(AllDates));
[tf,ix] = ismember(Dates, AllDates);
if ~all(tf);  error('Some dates not in reference set');  end
Dat2(ix) = Dat;