문제

나는 작동하는 코드가 있지만 약간의 병목 현상이 있으며, 속도를 높이는 방법을 알아 내려고 노력하고 있습니다. 그것은 루프에 있으며, 그것을 벡터화하는 방법을 알 수 없습니다.

TimesSeries 데이터를 나타내는 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

어떤 아이디어? 미리 감사드립니다.

도움이 되었습니까?

해결책

그것은 벡터화하기 어려운 문제입니다. 나는 그것을 사용하는 방법을 제안 할 수 있습니다 셀프, 그러나 나는 그것이 당신의 문제가 더 빨라질 것이라고 보장 할 수 없습니다 (당신은 당신이 사용하는 특정 데이터 세트에서 직접 시간을 내야 할 것입니다). 논의 된 바와 같이 이것은 다른 질문입니다, 벡터화는 그렇지 않습니다 언제나 루프보다 더 빨리 작동합니다. 가장 문제가되는 것은 매우 문제가 될 수 있습니다. 이 면책 조항을 사용하면 셀프 펀 버전과 더 빨리 실행될 수있는 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 행을 그룹화합니다 발스 셀 어레이의 세포로 같은 시작 날짜가 같은 Valcell. 변수 뉴 발스 길이의 셀 배열이 될 것입니다 숫자 (고유 한), 각 셀에 수행 결과가 포함됩니다. 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

다른 팁

다른 변수 (날짜)에 따라 행이 합산되는 행렬의 행에서 합 또는 평균을 형성하는 것만으로도 내 Consolidator 함수를 사용하기 만하면됩니다. 이 작업을 정확하게 수행하도록 설계되어 표시기 시리즈의 값을 기반으로 데이터를 줄입니다. (실제로 Consolidator는 ND 데이터에서도 작동 할 수 있으며 공차로 작업 할 수 있지만 월 및 연도 정보를 전달하기 만하면됩니다.)

Matlab Central의 파일 교환에서 Consolidator를 찾으십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top