查找事件元素之间的长度

时间:2014-07-01 19:49:55

标签: arrays matlab

我有一个矩阵,其中包含1&#39; s,-1&#39; s和<...>

state=[1; 1; -1; 1; -1; 0; 0; 0; 0; 0; 0; 0; 0; 1; 0; -1; 1; 0; -1.........];

假设-1是事件的开始,当它在(-1和1)之间作为-1仍然是开始而1是事件结束时,0对它的长度有贡献。但当0出现在1后,这意味着它最近没有任何价值;我们不能考虑到这一点。

所以我需要得到发生的此类事件的数量以及这些事件的整个矩阵中的事件的长度,以便我的输出

result=[2 10 2........]

并且不需要这样的事件。

在上述情况下,我会排除我的前两个指数1,这些指数对任何事情都没有贡献。

这听起来很简单,但有一段时间我回到了matlab。这是我尝试但它失败了,因为它应该被排除在1和-1之间的零:

result=[find(state==-1)-find(state==1)];

这是错误的。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

请按照以下步骤操作:

  1. 查找所有开始和所有目的。
  2. 每次开始时,请在紧接其后找到结尾。
  3. 减去步骤2中找到的每个末尾减去每个相应的开头,并且不要忘记添加1。
  4. 事件的数量是立竿见影的。
  5. 有趣的部分是步骤2. bsxfun测试,对于开始和结束的每个组合,如果开始小于结束。然后max的第二个输出给出每个开始的第一个 true值的索引(如果有的话);并且它的第一个输出告诉你是否确实存在某些 true值(即,如果找到的索引有效)。

    starts = find(state(:)==-1);                              % // step 1
    ends = find(state(:)==1);                                 % // step 1 
    [valid, next_end] = max(bsxfun(@lt, starts.', ends));     %'// step 2
    result = ends(next_end(valid)) - starts(valid) + 1;       % // step 3
    number = numel(result);                                   % // step 4