查找相似组元素的索引

finding indeces of similar group elements

我有一个向量 test2,其中包含随机顺序的 NaN 01(我们无法做出任何假设)。

test2 = [NaN 1 1 1 0 0 0 NaN NaN NaN 0 0 0 1 1 1 0 1 1 1 ];

我想对包含连续 1 的元素进行分组,并在分隔向量 startfinish 中包含组的第一个和最后一个索引。

在这种情况下 startfinish 应该是:

start = [2 14 18];
finish = [4 16 20];

我尝试调整提供的代码 here 提出了这个不起作用的解决方案...你能帮我找到正确的解决方案并告诉我为什么我试过的那个不起作用吗?

a = (test2 ==1);
d = diff(a);
start = find([a(1) d]==1);                        % Start index of each group
finish = find([d - a(end)]==-1);                  % Last index of each group


start =

     2    14    18


finish =

     2     3     5     6     7     8     9    10    11    12    14    15    18    19

我在 Windows 上使用 MATLAB R2013b 运行。 我还尝试在 ubuntu.

上使用 MATLAB R2013a 运行
a = (test2 ==1)
d=diff([0 a 0])
start=find(d==1)
finish=find(d==-1)-1

最简单的方法是在开头和结尾补零。那么组从索引 1 开始或在最后一个索引结束的特殊情况不会导致问题。

完整输出:

>> test2 = [NaN 1 1 1 0 0 0 NaN NaN NaN 0 0 0 1 1 1 0 1 1 1 ]

test2 =

  Columns 1 through 16

   NaN     1     1     1     0     0     0   NaN   NaN   NaN     0     0     0     1     1     1

  Columns 17 through 20

     0     1     1     1

>> a = (test2 ==1)

a =

  Columns 1 through 16

     0     1     1     1     0     0     0     0     0     0     0     0     0     1     1     1

  Columns 17 through 20

     0     1     1     1

>> d=diff([0 a 0])

d =

  Columns 1 through 16

     0     1     0     0    -1     0     0     0     0     0     0     0     0     1     0     0

  Columns 17 through 21

    -1     1     0     0    -1

>> start=find(d==1)

start =

     2    14    18

>> finish=find(d==-1)-1

finish =

     4    16    20

>> 

问题出在 finish = find([d - a(end)]==-1); 行,尤其是 a(end) == 1 行。有两个步骤可以纠正这个问题。首先,将问题行更改为 finish = find(d==-1); 这告诉 MATLAB,"Look for the elements where the difference between adjacent elements is -1"。换句话说,向量从 1 移动到 0 或 NaN。如果您 运行 代码,您将得到

start =  2    14    18
finish = 4    16

现在,您会注意到未检测到最后一个元素(即我们应该得到 finish(3) == 20。这是因为 d 的长度比 test2;函数diff无法计算出最后一个元素与不存在的last+1个元素的差值!

为了解决这个问题,我们应该修改 a:

a = [(test2 == 1) 0];

您将获得 startfinish 的正确输出。