Сумма значений столбцов на основе datenum в Matlab - PullRequest
0 голосов
/ 28 декабря 2018

Мне интересно, существует ли эффективный способ grouping/summing column значений matrix на основе serial number date column (в годах) в Matlab version 2013.Чтобы проиллюстрировать мою точку зрения, предположим, что данные выглядят следующим образом:

  737421           3
  737106          -1
  737222           4
  736084           7
  726105          -2
  726442           4

`Ожидается получить:

6 7 2

* PS: использование aggregateФункция может решить эту проблему в последней версии Matlab

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Вы можете просто индексировать дату и суммировать значения, которые будут простыми.Проблема будет в размере массива для поиска.Если оно очень большое, вы можете сделать дерево из данных, так как date будет Node, и вы можете поместить idx в массив как значение на этом узле.Затем найдите в дереве начальную и конечную даты, что даст вам индексный диапазон в массиве для суммирования.Построить дерево и поиск легко, и есть примеры в Интернете.

x = [737421  3
     737106 -1
     737222  4
     736084  7
     726105 -2
     726442  4]; % data
idx = x(:,1) >= 737421 & x(:,1) <= 737222;
out = sum(x(idx,2));

редактировать:

% Just updating to give one of the values to be correct. 
% There would have to be a for loop to check every 
% year range so @Luis Mendo is the best solution.
idx = x(:,1) >= 737106 & x(:,1) <= 737421; % index for each year
out = sum(x(idx,2));
0 голосов
/ 28 декабря 2018

Это мой подход:

x = [737421  3
     737106 -1
     737222  4
     736084  7
     726105 -2
     726442  4]; % data
[~, ~, u] = unique(datestr(x(:,1), 'yyyy'), 'rows', 'stable'); % convert to years as
     % a 2D char array, and then get unique labels of each year (row) preseving order
y = accumarray(u, x(:,2)); % compute sums grouped by those labels
...