我有一个向量test2
,其中包含NaN 0
和1
的随机顺序(我们无法做出任何假设)。
test2 = [NaN 1 1 1 0 0 0 NaN NaN NaN 0 0 0 1 1 1 0 1 1 1 ];
我想对包含连续1
的元素进行分组,并在分页向量start
和finish
中包含组的第一个和最后一个索引。
在这种情况下,start
和finish
应为:
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。
答案 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];
您将获得start
和finish
的正确输出。