2015-01-26 9 views
2

폭풍의 지속 시간을 결정하기 위해 특정 폭풍의 모든 관측과 다중 폭풍 중 허리케인 관측 사이에 연속 시간 (변수 'hrs')을 누적하여 합계하려고합니다. 이것은 내가 무엇을 가지고 :루프 누적 합계 matlab

stormid = [188, 188, 288, 288, 288, 388, 488, 488, 588...] %numbers represent a unique 
% code identifying a particular storm (i.e. 188= 1st storm of 1988) 

hrs = [0,6,0,6,6,0,0,6,0...] %hours between observations in each storm 
% where 0 indicates the start of a storm (this corresponds with the stormid above) 

내 목표는 각 폭풍 ID의 시간 합계를, 그래서 일하는 것이 accumarray를 사용하여 생각했지만 그렇지 않았다. 여기 내가 시도한 것이있다.

duration= accumarray(stormid, hrs, []); 

그런 다음 나는 cumsum을 시도했지만 폭풍우 id가 같을 때만 cumsum을 사용하는 방법을 알아낼 수 없었습니다.

누구나 아이디어가 있다면 크게 감사하겠습니다. 감사.

+0

나는 이것을 깔끔하게하는 방법을 생각할 수 없다. 'accumarray '는 벡터가 아닌 스칼라를 반환하는 함수에서만 사용할 수 있으므로'cumsum'과 함께 사용할 수 없습니다. 새 ID 번호를 찾을 때마다 시작하여'stormid'를 반복하고'hrs'를 수동으로 합칠 수 있습니까? – eigenchris

+0

'duration = accumarray (stormid, hrs, []);'에 대한 오류 메시지는 무엇이라고합니까? '두 번째 입력 VAL은 SUBS에서 각'** row **'또는 스칼라에 대해 하나의 요소를 갖는 벡터 여야합니다. 'doc accumarray'의 두 번째 예제를 읽었을 때이 전이 문제를 해결할 수 있습니다. – knedlsepp

+0

sidenote : stormID가 연속적이지 않으므로 열 벡터와 함께 'accumarray'를 사용하는 대신 값을 합계 할 수 있지만 메모리를 절약 할 수있는'sparse'를 사용해야합니다 (또는 ID를 '고유'를 사용하여 선처리 단계에서). – knedlsepp

답변

0

이 기능은 작동합니까?

편집 : 의견을 제시 할 포인트가 부족하여 여기에 제안 된 코드를 수정했습니다. (나는 기간이 충분히 넓은하지 않기 때문에 오류가 발생한다고 가정에서 수정 건가요?)

clear duration 
unique_storm_id = unique(stormid); 
duration = zeros(length(unique_storm_id),length(hrs)); 
for k = 1:length(unique_storm_id) 
    duration{k} = cumsum(hrs(stormid == unique_storm_id)); 
end 

는 그런 다음

index = find(unique_storm_id == j); 
duration{index} 
+0

위의 코드를 시도했지만 "인덱스가 매트릭스 크기를 초과합니다"라는 오류 메시지가 표시됩니다. – runnere127

+0

편집 해 주셔서 감사합니다.하지만 여전히 동일한 오류 메시지가 표시됩니다 ... – runnere127

+0

오류 메시지와 줄은 무엇입니까? 오류가 발생합니까? – whyyes

0

이를 시도해보십시오 폭풍 ID = J의 기간에 액세스 할 수 있습니다

uni_id = unique(stormid); 
cumdur = arrayfun(@(x) cumsum(hrs(stormid == x)), uni_id, 'uni', false); 

결과, cumdur는 연속적인 (고유의) stormid 년대 붙이고 hrs인가 cumsum 결과 세포 배열이다.