вектор времени обновления Matlab - PullRequest
3 голосов
/ 19 января 2012

У меня 19 ячеек (19x1) с данными о температуре за весь год, где первые 18 ячеек представляют 20 дней (каждая), а последняя ячейка представляет 5 дней, следовательно (18 * 20) +5 = 365 дней.

В каждой ячейке должно быть 7200 измерений (кроме ячейки 19), где каждое измерение проводится каждые 4 минуты, таким образом, 360 измерений в день (360 * 20 = 7200).

Вектор времени для измерений выражается только как число дня, то есть 1,2,3 ... и т. Д. (Таким образом, без десятичного дня), поэтому отображается как 360 x 1 ... и т. д.

Так как датчик вышел из строя в течение нескольких дней, некоторые ячейки содержат менее 7200 измерений, где один в В частности, содержится 858 строк, что выглядит примерно так:

a=rand(858,3);
a(1:281,1)=1;
a(281:327,1)=2;
a(327:328,1)=5;
a(329:330,1)=9;
a(331:498,1)=19;
a(499:858,1)=20;

Где столбец 1 = день, столбцы 2 и 3 - данные.

Зная, что число каждого дня должно повторяться 360 раз, существует ли способ включения дополнительного сумма каждого значения от 1:20, чтобы составить 360. Например, первый столбец требует 79 х 1, 46 х 2, 360 х 3 ... и т. Д .; где итоговый массив должен иметь 7200 значений в заказ от 1 до 20.

Если это возможно, в строках, в которые были добавлены эти значения, второй и третий столбцы должны изменился на нан.

Я понимаю, что это необычный вопрос, и что трудно понять, о чем спрашивают, но я надеюсь, что я четко изложил то, что я пытаюсь получения идеальной. Любые советы будут высоко ценится.

Ответы [ 2 ]

1 голос
/ 19 января 2012

Вот один из способов сделать это для данного элемента матрицы ячейки:

full=zeros(7200,3)+NaN;

for i = 1:20              % for each day
    starti = (i-1)*360;   % find corresponding 360 indices into full array
    full( starti + (1:360), 1 ) = i;  % assign the day
    idx = find(a(:,1)==i);            % find any matching data in a for that day
    full( starti + (1:length(idx)), 2:3 ) = a(idx,2:3); % copy matching data over
end

Возможно, вы могли бы использовать arrayfun, чтобы сделать это более гладким, и, возможно, (??) быстрее.

Вы можете превратить это в функцию и использовать cellfun, чтобы применить ее к своей ячейке.

PS - если вы зададите свой вопрос на справочных форумах Matlab , вы определенно получите более интересный и эффективный ответ, чем этот. Возможно, с участием bsxfun или arrayfun или accumarray или что-то в этом роде.

Обновление - чтобы сделать это для каждого элемента в массиве ячеек, единственное изменение состоит в том, что вместо поиска i в качестве номера дня вы рассчитываете его на основании того, как далеко вы находитесь в массиве ячеек. , Вы бы сделали что-то вроде (не проверено):

for k = 1:length(cellarray)
    for i = 1:length(cellarray{k})
        starti = (i-1)*360;                % ... as before
        day = (k-1)*20 + i;                % first cell is days 1-20, second is 21-40,...
        full( starti + (1:360),1 ) = day;  % <-- replace i with day
        idx = find(a(:,1)==day);           % <-- replace i with day
        full( starti + (1:length(idx)), 2:3 ) = a(idx,2:3);  % same as before
    end
end
0 голосов
/ 19 января 2012

Я не уверен, что правильно понял, что вы хотите сделать, но ниже показано, сколько измерений вы пропускаете за каждый день, и добавьте внизу вашей матрицы «а» дополнительные строки, чтобы вы получили полную матрицу 7200x3.

nbMissing = 7200-size(a,1);
a1 = nan(nbmissing,3)

l=0
for i = 1:20
  nbMissing_i = 360-sum(a(:,1)=i);
  a1(l+1:l+nbMissing_i,1)=i;
  l = l+nb_Missing_i;
end

a_filled = [a;a1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...