如何在MATLAB中找到序列中的趋势?

时间:2014-09-11 11:45:25

标签: matlab loops

我有一个1和0的辅助功能矢量。 1表示天气好; 0表示天气不好,无法进入。

我有一个(例如)10小时的step_duration。考虑到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

4 个答案:

答案 0 :(得分: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个组的起始位置的索引

答案 1 :(得分: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

结果在向量startsends中。在您的示例中,只有一个这样的窗口,因此它们只包含一个元素:

starts =
   109
ends =
   118

答案 2 :(得分: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 =
     []

答案 3 :(得分:0)

我认为你正在寻找一个天气好的时期,在这段时间内,这个时期将被定义为在10天内有足够的时间。

在这种情况下,您可以使用过滤器来检查每一段10中出现的过滤器数量。可能是这样的:

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

不确定语法,但请查看。过滤器肯定会让你到那里。

然后你可以通过寻找好的时期来跟进:

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