找到类似组元素的缺陷

时间:2015-06-29 17:22:44

标签: matlab indexing grouping

我有一个向量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。

2 个答案:

答案 0 :(得分:2)

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

>> 

答案 1 :(得分:1)

问题是行finish = find([d - a(end)]==-1);,特别是a(end) == 1。纠正这个有两个步骤。首先,将问题行更改为finish = find(d==-1);这告诉MATLAB,“查找相邻元素之间差异为-1的元素”。换句话说,矢量从1移位到0或NaN。如果您运行代码,您将获得

start =  2    14    18
finish = 4    16

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

要解决此问题,我们应该修改a

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

您将获得startfinish的正确输出。