How to find a trend in a sequence?
5 次查看(过去 30 天)
显示 更早的评论
I have an accessibility vector with 1's and 0's. 1 means the weather is good; and 0 meaning the weather is not good and the place is not accessible.
I have a step_duration of (e.g.) 10 hrs. Considering the step_index (start of the step) as 101,I need to find a window of straight 10 hrs of good weather.
Expected solution: With 10 hours of expected weather, say the accessibility vector is [0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1] . So, the indexes that we find the window are from 109-118. And the corresponding weather delay (considering we could not find straight hours) is from index 101-108 (i.e. 9 hours.) I need to write a code for such an algorithm.
Some sample code that I could think of is as follows( though this is not exactly what I want):
window = 0; % Initialize the counter for finding the weather window.
for tt = step_index
if Accessibility(tt) == 0
% bad weather, move to next index
% reset window.
window = 0;
k = k + 1;
possible_window(k) = window;
continue
else
% Increase window
window = window + 1;
% sote window history
k = k + 1;
possible_window (k) = window;
end
end
tt = tt + 1;
end
if true
% code
end
回答(2 个)
Star Strider
2014-9-11
You can use the filter function (here, ‘av’ is the accessibility vector):
av = randi(2, 1, 100)-1; % Create Data
av(20:29) = ones(1,10); % Insert Series of 10 1’s
y = filter(ones(1,10), 10, av);
yf = find(y > 0.99);
The ‘yf’ variable will find the end index of the sequences, and the size of ‘yf’ will be the number of sequences in a given accessibility vector.
4 个评论
Star Strider
2014-9-11
编辑:Star Strider
2014-9-11
My code finds the end-indices of your ‘step_duration’ as I understand it. To find the beginnings, count back 10. (Also, if there are 11 consecutive 1s, it will return 2 indices, if 12, 3 indices, and so on.) I don’t understand how ‘step_index’ enters into it, since it wasn’t part of the ‘accessibility vector’ you posted.
If you have fewer than 10 consecutive 1s, it will generate values <1. If you have other criteria for the step_duration — fewer or more than 10 consecutive 1s — change the filter coefficients appropriately, with the ‘b’ vector a ones vector of appropriate length, and changing the ‘a’ vector (the 10 in my code) to the length of the ones vector.
If you want to find the occurrences of ‘[1 0 1]’, use the same filter idea with a different pattern:
av = randi(2, 1, 100)-1;
si = filter([1 0 1], 2, av);
sidx = find(si > 0.99);
The ‘si’ vector is 1 where the the filter detects the end of a ‘[1 0 1]’ sequence. The ‘b’ value has to be the sum of the elements of the ‘a’ vector.
I don’t understand the algorithm you need to write, but my code gets you very close. It can detect the ‘step_index’ with the ‘sidx’ variable, and detect the ‘step_duration’ in the ‘yf’ variable as you defined it in your Question, and can give you the indices for both. The filter calls will take your entire 87600-element vector and produce the indices for the required patterns. It seems to me all you then need to do is program the logic relating to the ‘step_index’ and ‘step_duration’ indices to do what you want.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Data Preprocessing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!