在Matlab中用nans填充剩余的数据集

时间:2013-06-22 07:33:19

标签: 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-12-31 23:00','yyyy-mm-dd HH:MM');

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

3 个答案:

答案 0 :(得分:1)

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

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

注意:如果您希望将两组日期联合起来,例如A和B,其中不失一般性A包括B,那么你可能有a_n< = b_n< a_n + 1在这种情况下不能简单地填充数组,但是你需要用NaN填充。这涉及使用ismember()和逻辑索引,甚至是accumarray()

答案 1 :(得分:0)

如果您确定最后只需要使用NaN填充数据,则只需使用:

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

答案 2 :(得分:0)

您可以就地扩展数组以填充结尾或使用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可能会给您带来问题。