정말 느린 matlab에 루프에 대한이 문제를 vectorizing 데 문제가 있습니다.tvec 및 데이터는 각각 Nx6 및 Nx4 배열이며 함수에 대한 입력입니다.벡터화 대신 matlab에 루프를 중첩했습니다
% preallocate
sVec = size(tvec)
tvec_ab = zeros(sVec(1),6);
data_ab = zeros(sVec(1),4);
inc = 0;
for i = 1:12
for j = 1:31
inc = inc +1;
[I,~] = find(tvec(:,3)==i & tvec(:,2)== j,1,'first');
if(I > 0)
tvec_ab(inc,:) = tvec(I,:);
data_ab(inc,:) = sum(data((tvec(:,3) == j) & (tvec(:,2)==i) ,:));
end
end
end
% set output values
tvec_a = tvec_ab(1:inc,:);
data_a = data_ab(1:inc,:);
tvec
모든 행 데이터는 데이터 매트릭스의 동일 행에서 촬영 된 타임 스탬프를 나타낸다.
tvec
: [year, month, day, hour, minute, second]
data
을 : 당신이 행의 모습 방법을 볼 수 있습니다 아래의 [dataA, dataB, dataC, dataD]
을 메인 프로그램에서 우리는 월, 일 또는 시간 후에 "집합"을 선택할 수 있습니다. 위의 코드는 'DAY'
옵션에 대한 집계가 어떻게 발생하는지 보여주는 예입니다.
첫 번째 시간 스탬프는 우리 출력의 tvec_a
이 해당 날짜의 행에 포함되기를 원하는 시간 스탬프입니다.
그날 (이 경우 행)의 데이터 출력은 해당 날짜의 모든 데이터의 합계가됩니다. 예 :
data
:
[data1ADay1, data1BDay1, data1CDay1, data1DDay1;
data2ADay1, data2BDay1, data2CDay1, data2DDay1]
집계 된 데이터 :
[data1ADay1 + data2ADay1, data1BDay1 + data2BDay1, data1CDay1+ data2CDay1,
data1DDay1+data2DDay1]
N의 == 12 * 31 – rahnema1
예, 예에 대한 결과 매트릭스 N 당신이 설명하는 결과가 될 것으로 보인다 있지만. 그러나 우리는 입력 벡터로부터 얼마나 큰 N인지 알지 못하며 사용자가 어떤 집합 옵션을 선택했는지 알지 못합니다 (이 경우에는 일의 집합이므로 12 * 31). 그러나 예를 들어 사용자가 시간을 선택하면 N == 12 * 31 * 24 –
['accumarray'] (https://nl.mathworks.com/help/matlab/ref/accumarray.html)와 같은 소리가 여기에 오는 방법입니다 –