Заполните оставшуюся часть набора данных с помощью nans в Matlab

У меня есть набор данных, который имеет некоторые измерения за данный период времени:

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');

Где Dat, например, между 2011-07-31 23:00 и 2011-12-31 23:00 будет NaN?


person KatyB    schedule 22.06.2013    source источник
comment
Обычный или чесночный нанс?   -  person Lennart Regebro    schedule 22.06.2013


Ответы (3)


Если у вас R2013a, то вы также можете использовать padarray():

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

ПРИМЕЧАНИЕ: если вы хотите объединить два набора дат, например A и B, где без ограничения общности A включает B, тогда у вас может быть a_n ‹= b_n ‹ a_n+1, и в этом случае вы не можете просто заполнить массив, но вам нужно заполнить его NaN. Это включает в себя использование ismember() и логического индексирования или даже accumarray().

person Oleg    schedule 22.06.2013

Если вы уверены, что данные нужно дополнить только NaN в конце, вы можете просто использовать:

pad_length = length(Jday) - length(Dat);
pad = ones(pad_length,1)*NaN;
Dat = [Dat;pad];
person Martin J.H.    schedule 22.06.2013

Вы можете расширить массив на месте, чтобы дополнить конец, или стереть его с помощью 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 в конец (то есть вы знаете, что даты соответствуют первым n точкам в AllDates), вы можете использовать простое присваивание несуществующим элементам для расширения массива.

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 может вызвать проблемы, если у вас есть двумерные массивы.

person Andrew Janke    schedule 01.07.2013