2012-11-26 3 views
6

Matlab에서 86400 풍속 (WS) 값의 1 초 데이터 세트를 가지고 있으며 필터링에 도움이 필요합니다. 그것은 어느 정도의 영리함을 필요로합니다.두뇌 티저 - 이동 평균을 사용한 알고리즘 필터링

평균 WS 초과 경우

  • 25m/s를 600S의 시간 간격
  • 28m/s 30 시간 간격
  • 30m/s로 3의 시간 간격

이 매개 변수 중 하나라도 충족되면 평균 WS가 300 초 시간 간격으로 22m/s 미만으로 유지 될 때까지 WS는 '유효하지 않은 것으로 간주됩니다.

여기는 600 초 요구 사항입니다. 나는 '데이터 세트'에 포함 된 데이터에 대해 600 ~ 300 초의 이동 평균을 수행합니다. 평균 25m/s의 첫 번째 모습부터 22m/s 이하의 다음 모습까지의 간격을 'NaN'으로 필터링합니다. 필터링 후에는 또 다른 600 초 평균을 수행하고 NaN으로 플래그가 지정된 값의 간격은 NaN으로 남습니다.

Rolling600avg(:,1) = tsmovavg(dataset(:,2), 's', 600, 1); 

Rolling300avg(:,1) = tsmovavg(dataset(:,2), 's', 300, 1); 

a = find(Rolling600avg(:,2)>25) 

b = find(Rolling300avg(:,2)<22) 

dataset(a:b(a:find(b==1)),2)==NaN; %?? Not sure 

이 '발견'어떤 색인의 영리한 사용을 필요로 할 것이다. 누군가 나를 도울 수 있었습니까? 28m/s 및 30m/s 필터는 동일한 방법을 따릅니다.

+0

문제 해결에 지나치게 관련이 없지만 "WS"로 풍속을 의미하는 것으로 추측하고 있습니까? – Mac

+0

네, 고마워요. 나는 그것을 덧붙였다. – user1854628

+0

그 마지막 성명서로 무엇을하려합니까? – jerad

답변

1

질문에 답하는 방법 중 하나는 for 루프를 사용하여 NaN 시작 및 끝 부분을 식별하는 것입니다.

m = [19 19 19 19 28 28 19 19 28 28 17 17 17 19 29 18 18 29 18 29]; %Example data 
a = find(m>25); 
b = find(m<22); 
m2 = m; 
% Use a loop to isolate segments that should be NaNs; 
for ii = 1:length(a) 
    firstNull = a(ii) 
    lastNull = b(find(b>firstNull,1))-1 % THIS TRIES TO FIND A VALUE IN B GREATER THAN A(II) 
    % IF THERE IS NO SUCH VALUE THEN NANS SHOULD FILL TO THE END OF THE VECTOR 
    if isempty(lastNull), 
     lastNull=length(m); 
    end 
    m2(firstNull:lastNull) = NaN 
end 

tsmovavg가 전달 된 것과 동일한 길이의 벡터를 리턴하는 경우에만 작동합니다. 그렇지 않다면 더 까다 롭고 약간의 수정이 필요할 것입니다.

for 루프를 피할 수있는 방법이 있지만 이것은 아주 간단한 해결책입니다.

+1

네,이게 효과가 있다고 생각합니다. WS가 300 초 동안 22m/s보다 작을 때 모두 끝나는 세 가지 경우가 있습니다. 이것은 하나의 경우입니다. m1 = tsmovavg (dataset, 's', 300, 1); m2 = tsmovavg (dataset, 's', 600, 1); a = find (m1 <22); b = 찾기 (m2> 25); m21 = m2; % 루프를 사용하여 NaN이어야하는 세그먼트를 분리하십시오. ii = 1 : 길이 (b) firstNull = b (ii) lastNull = a (찾기 firstNull, 1) -1 isempty (lastNull), lastNull = length (m2); end m21 (firstNull : lastNull) = NaN; end – user1854628

+1

예,이 방법을 모든 기준에 적용해야합니다. 나는 이것이 도움이되기를 바랍니다. 문제가 해결 되었다면 내 답변 옆에있는 체크 표시를 선택하여 자유롭게 답을 수락하십시오. – jerad

관련 문제