У меня есть код, который работает, но это немного узкое место, и я застреваю, пытаясь понять, как ускорить его. Это в цикле, и я не могу понять, как его векторизовать.Bucketing Algorithm
У меня есть 2D-массив, vals, который представляет данные о временных рядах. Строки - это даты, столбцы - разные серии. Я пытаюсь записать данные по месяцам для выполнения различных операций над ним (сумма, значение и т. Д.). Вот мой текущий код:
allDts; %Dates/times for vals. Size is [size(vals, 1), 1]
vals;
[Y M] = datevec(allDts);
fomDates = unique(datenum(Y, M, 1)); %first of the month dates
[Y M] = datevec(fomDates);
nextFomDates = datenum(Y, M, DateUtil.monthLength(Y, M)+1);
newVals = nan(length(fomDates), size(vals, 2)); %preallocate for speed
for k = 1:length(fomDates);
Это следующая строка является узким местом, потому что я называю это так много раз (зацикливание)
idx = (allDts >= fomDates(k)) & (allDts < nextFomDates(k));
bucketed = vals(idx, :);
newVals(k, :) = nansum(bucketed);
end %for
Любые идеи.? Заранее спасибо.
Это должно быть сделано с помощью [ 'accumarray'] (https://www.mathworks.com/help/matlab/ref/accumarray.html) ... –