2012-11-26 33 views
6

Tôi có một bộ dữ liệu thứ hai về giá trị tốc độ gió 86400 (WS) trong Matlab và cần hỗ trợ lọc nó. Nó đòi hỏi một mức độ thông minh nhất định.Brain teaser - thuật toán lọc sử dụng đường trung bình di chuyển

Nếu WS trung bình vượt quá:

  • 25m/s trong một thời gian 600s khoảng
  • 28m/s trong một khoảng thời gian 30 giờ
  • 30m/s trong khoảng thời gian 3 s

Nếu bất kỳ tham số nào được đáp ứng, WS được coi là 'không hợp lệ' cho đến khi WS trung bình vẫn dưới 22m/s trong khoảng thời gian 300 s.

Đây là những gì tôi có cho yêu cầu 600 giây. Tôi làm trung bình di chuyển 600 và 300 giây trên dữ liệu chứa trong 'dataset'. Tôi lọc các khoảng thời gian từ lần xuất hiện đầu tiên có giá trị trung bình 25m/s sang lần xuất hiện tiếp theo có giá trị dưới 22m/s là 'NaN'. Sau khi lọc, tôi sẽ thực hiện 600 giây trung bình khác, và khoảng thời gian với các giá trị được gắn cờ bằng NaN sẽ bị bỏ lại một NaN.

ví dụ:

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 

Điều này sẽ đòi hỏi phải có sử dụng thông minh của 'tìm' và một số chỉ mục. ai đó có thể giúp tôi không? Bộ lọc 28m/s và 30m/s sẽ theo cùng một phương pháp.

+0

Không phải là nó quá liên quan để giải quyết vấn đề, nhưng tôi đoán rằng bằng "WS" bạn có nghĩa là tốc độ gió? – Mac

+0

Vâng, cảm ơn. Tôi đã thêm vào đó. – user1854628

+0

bạn đang cố gắng làm gì với tuyên bố cuối cùng đó? – jerad

Trả lời

1

Nếu tôi làm theo câu hỏi của bạn, một cách tiếp cận là sử dụng vòng lặp for để xác định nơi NaN bắt đầu và kết thúc.

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 

Lưu ý rằng thao tác này chỉ hoạt động nếu tsmovavg trả về một véc tơ có độ dài bằng nhau khi vé được truyền tới nó. Nếu không thì nó phức tạp hơn và sẽ yêu cầu một số sửa đổi.

Có lẽ một số cách để tránh vòng lặp for nhưng đây là một giải pháp khá đơn giản.

+1

Có, tôi nghĩ rằng điều này sẽ làm việc. Có 3 trường hợp riêng biệt, tất cả kết thúc khi WS nhỏ hơn 22m/s trong 300 giây. Đây là một trường hợp: m1 = tsmovavg (tập dữ liệu, 's', 300, 1); m2 = tsmovavg (tập dữ liệu, 's', 600, 1); a = find (m1 <22); b = tìm (m2> 25); m21 = m2; % Sử dụng vòng lặp để tách phân đoạn phải là NaN; cho ii = 1: chiều dài (b) firstNull = b (ii) lastNull = a (tìm (a> firstNull, 1)) -1 nếu isEmpty (lastNull), lastNull = chiều dài (m2); kết thúc m21 (firstNull: lastNull) = NaN; kết thúc – user1854628

+1

có, bạn sẽ phải áp dụng phương pháp này cho tất cả các tiêu chí của mình. Tôi hy vọng điều này đã giúp. nếu nó giải quyết được vấn đề của bạn, hãy chấp nhận câu trả lời của tôi bằng cách đánh dấu vào dấu chọn bên cạnh câu trả lời của tôi. – jerad

Các vấn đề liên quan