2017-01-16 3 views
2

정말 느린 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] 
+0

N의 == 12 * 31 – rahnema1

+0

예, 예에 대한 결과 매트릭스 N 당신이 설명하는 결과가 될 것으로 보인다 있지만. 그러나 우리는 입력 벡터로부터 얼마나 큰 N인지 알지 못하며 사용자가 어떤 집합 옵션을 선택했는지 알지 못합니다 (이 경우에는 일의 집합이므로 12 * 31). 그러나 예를 들어 사용자가 시간을 선택하면 N == 12 * 31 * 24 –

+0

['accumarray'] (https://nl.mathworks.com/help/matlab/ref/accumarray.html)와 같은 소리가 여기에 오는 방법입니다 –

답변

0

내가 실제로 나 자신을 할 수있는 방법을 발견 :

당신의 응답을
%J is the indexes of the first unique days (eg. if there is multiple 
    %data from january 1., the first time stamp from january 1. will be 
    %the time samp for our output) 
    [~,J,K] = unique(tvec(:,2:3),'rows'); 
    %preallocate 
    tvec_ab = zeros(length(J),6); 
    data_ab = zeros(length(J),4); 
    tvec_ab = tvec(J,:); 
    %sum all data from the same days together column wise. 
    for i = 1:4 
     data_ab(:,i) = accumarray(K,data(:,i)); 
    end 
    %set output 
    data_a = data_ab; 
    tvec_a = tvec_ab; 

감사

0

vectorized 버전 (완전히 테스트되지 않음)

[x y] = meshgrid(1:12,1:31); 
XY=[x(:) Y(:)]; 
[I,loc]=ismember(XY,tvec(:,2:3),'rows'); 
tvec_ab(I)=tvec(loc(loc>0),:); 
acm = accumarray(tvec(:,2:3),data); 
data_ab(I) = acm(sub2ind(size(acm),tvec(:,2),tvec(:,3)));