2014-09-11 3 views
1

У меня есть вектор доступности с 1 и 0. 1 означает, что погода хорошая; и 0 означает, что погода не очень хорошая, и место недоступно.Как найти тренд в последовательности в MATLAB?

У меня есть step_duration (например, 10 часов). Учитывая step_index (начало шага) как 101, мне нужно найти окно с прямыми 10 часами хорошей погоды.

Ожидаемое решение: с 10-часовой ожидаемой погодой, скажем, вектор доступности [0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1]. Итак, индексы, которые мы находим, находятся от 109-118. А соответствующая погодная задержка (учитывая, что мы не могли найти часы подряд) - от индекса 101-108 (т. Е. 9 часов). Мне нужно написать код для такого алгоритма.

Некоторые примеры кода, которые я мог думать о том, как следует (хотя это не совсем то, что я хочу):

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 

ответ

2

Я не уверен, что именно выход вы после, но вы можете найти группа из 10 или более 1 с довольно легко с помощью свертки:

w = [0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1] 
n = 10; 
find(conv(w, ones(1,n)) == n) - n + 1 

это дает вам показатели, где группы 10 начала

+0

Следует отметить, что решение также может быть скорректирован довольно легко найти произвольную amound единиц в блоке 10. (путем изменения ' == n' в '> = 8' например). –

+0

@DennisJaheruddin Я не уверен, что вы имеете в виду, результат 'conv' здесь не может быть больше, чем' n', и если вы ищете меньшее число, то разве вы не установили бы 'n = 8'? – Dan

+0

Я имею в виду, что это решение также предлагает гибкость, чтобы найти по крайней мере 8 хороших моментов в окне 10. - Комментарий был в основном размещен на благо искателя. –

0

Я думаю, что вы ищете пер йод с хорошей погодой, где это будет определено как имеющее достаточное количество в участке 10.

В этом случае вы можете использовать фильтр, чтобы проверить, сколько из них происходит на каждом участке 10. Это может быть что-то вроде этого :

f= filter(ones(10,1),1,x) 

Не уверен в синтаксисе, но проверяйте его. Фильтр обязательно должен вас туда достать.

Вы могли бы следить за нахождение хороших периодов, как так:

find(f==10) 
find(f>=8) 
find(f==max(f)) 
1

Решение на базе strfind найти начиная индексы N или N + последовательные из них -

%// sample accessibility vector (different from the one in question) 
access_vec = [1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0] 

N = 10; %// N or N+ consecutive ones are to be detected 
indices = strfind([0 access_vec],[0 ones(1,N)]) 

Выход -

indices = 
    1 13 

Другой пример -

access_vec = [ 0 1 zeros(1,10) 1] 

Выход -

indices = 
    [] 
+0

Мне нравится подход. Но работает ли это? Попробуйте 'a1 = [0 1 нули (1,10) 1]' –

+0

Возможно, вам нужно 't1 = [1 diff (a1 == 1) 0]', если я попробую testvector, чтобы @Dan использовал текущий код пустой. –

+0

Возможно, вам нужно будет обнаружить _changes_ в 'a1', а не' 1' в 'a1'. Я писал свое решение (теперь опубликовано) на основе этого, когда я увидел ваш –

2

Пусть данные будут

w = [0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1]; 
step_index = 101; 
step_duration = 10; 

Тогда:

d = diff([0 w 0]); 
starts = find(d==1); %// indices of starts of runs of 1's 
ends = find(d==-1); %// indices of ends of runs of 1's (actually starts of 0's) 
keep = find(ends-starts>=step_duration); %// detect runs that are long enough 
starts = starts(keep)+step_index-1; %// keep only those runs and adjust with "-1" 
ends = ends(keep)+step_index-2; %// "-2" because of how ends is defined 

В результате в векторах starts в nd ends.В вашем примере есть только один такое окно, так как они содержат только один элемент:

starts = 
    109 
ends = 
    118 
Смежные вопросы