Это сложная проблема для векторизации. Я могу предложить способ сделать это, используя CELLFUN , но я не могу гарантировать, что это будет быстрее для вашей проблемы (вам придется самим рассчитывать время для конкретных наборов данных, которые вы используете). Как обсуждалось в этом другом вопросе SO , векторизация не всегда работает быстрее, чем для циклов. Это может быть очень проблематично, что является лучшим вариантом. С этим отказом от ответственности я предложу вам два решения: версию CELLFUN и модификацию версии for-loop, которая может работать быстрее.
РЕШЕНИЕ CELLFUN:
[Y,M] = datevec(allDts);
monthStart = datenum(Y,M,1); % Start date of each month
[monthStart,sortIndex] = sort(monthStart); % Sort the start dates
[uniqueStarts,uniqueIndex] = unique(monthStart); % Get unique start dates
valCell = mat2cell(vals(sortIndex,:),diff([0 uniqueIndex]));
newVals = cellfun(@nansum,valCell,'UniformOutput',false);
Вызов MAT2CELL группирует строки vals , имеющие одинаковую дату начала, вместе в ячейки массива ячеек valCell . Переменная newVals будет представлять собой массив ячеек длиной цифра (uniqueStarts) , где каждая ячейка будет содержать результат выполнения nansum для соответствующей ячейки valCell .
РЕШЕНИЕ ДЛЯ ПЕТЛИ:
[Y,M] = datevec(allDts);
monthStart = datenum(Y,M,1); % Start date of each month
[monthStart,sortIndex] = sort(monthStart); % Sort the start dates
[uniqueStarts,uniqueIndex] = unique(monthStart); % Get unique start dates
vals = vals(sortIndex,:); % Sort the values according to start date
nMonths = numel(uniqueStarts);
uniqueIndex = [0 uniqueIndex];
newVals = nan(nMonths,size(vals,2)); % Preallocate
for iMonth = 1:nMonths,
index = (uniqueIndex(iMonth)+1):uniqueIndex(iMonth+1);
newVals(iMonth,:) = nansum(vals(index,:));
end