Matlab: сумма для двух наборов данных временных рядов?

Мне нравится суммировать наблюдения двух наборов данных временных рядов, когда оба они имеют наблюдения, основанные на YEAR и DOY. Мне также нравится пропускать сумму, когда любой набор данных имеет 0, и делать сумму только для максимального наблюдения в этом DOY.

Вот пример: data_1 и data_2.

данные_1

% YEAR  DOY  OBS_1

1994    109 0.42
1994    110 0.73    
1994    111 0.69    
1994    113 0.8    
1994    114 0.43    
1994    115 0.75    
1994    123 0.6    
1994    127 0.2    
1994    131 0.44    
1994    131 0.43    
1994    131 0.63    
1994    132 0.99    
1994    132 0.51    
1994    133 0.71    
1994    133 0.99    
1994    134 0.65    
1994    134 0.69    
1994    134 0.97    
1994    134 0.03    
1994    134 0    
1994    134 0    
1994    135 0.68    
1994    135 0.72    
1994    136 1.22    
1994    136 0    
1994    136 0    
1994    136 1.28    
1994    136 1.34

данные_2:

% YEAR  DOY  OBS_2    
1994    110 0.92    
1994    111 0.34    
1994    113 0.42    
1994    114 0.37    
1994    115 0.38    
1994    122 0.22    
1994    127 0.32    
1994    131 0.34   
1994    131 0.2    
1994    132 0.51    
1994    132 0.43
1994    132 0.4    
1994    133 0.4    
1994    134 0.32    
1994    134 0.39    
1994    135 0.35    
1994    135 0.38    
1994    135 0.34    
1994    135 1.83    
1994    135 0.22    
1994    135 0.36    
1994    135 0.39    
1994    135 0.24    
1994    135 0.39    
1994    136 0.42    
1994    136 0.29    
1994    136 0.3    
1994    136 0.4    
1994    136 0.54    
1994    136 0.4

person Kuo-Hsien Chang    schedule 11.06.2012    source источник
comment
Пожалуйста, отредактируйте: выберите код и отформатируйте его, используя значок формата кода.   -  person learnvst    schedule 11.06.2012
comment
Что вы имеете в виду, когда любой набор данных имеет 0?   -  person Junuxx    schedule 11.06.2012
comment
Я вижу, что у вас есть повторяющиеся значения DOY в обоих наборах данных. Вы хотите суммировать их все, или как? Поясните, пожалуйста, и приведите пример, если можно.   -  person Eitan T    schedule 11.06.2012


Ответы (1)


Вот первая попытка:

%# maximum day of year
sz = max(max(data_1(:,2)),max(data_2(:,2)));
doy = (1:sz)';

%# get max value for each DOY in each dataset
v1 = accumarray(data_1(:,2), data_1(:,3), [sz 1], @max);
v2 = accumarray(data_2(:,2), data_2(:,3), [sz 1], @max);

%# compute the sum
v = v1 + v2;

%# keep entries where none of the values were zeros
idx = (v1~=0 & v2~=0);
v = [doy(idx(:)) v(idx(:))];

Результат:

>> v
v =
          110         1.65
          111         1.03
          113         1.22
          114          0.8
          115         1.13
          127         0.52
          131         0.97
          132          1.5
          133         1.39
          134         1.36
          135         2.55
          136         1.88

Я не принял во внимание поле year, так как оно 1994 во всех ваших данных...

person Amro    schedule 11.06.2012
comment
Привет, Амро, как учитывать поле года, потому что настоящие наборы данных приходят с многолетними наблюдениями. Вы действительно делаете мою жизнь проще. Спасибо. - person Kuo-Hsien Chang; 12.06.2012