查找相似组元素的索引
finding indeces of similar group elements
我有一个向量 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 运行
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];
您将获得 start
和 finish
的正确输出。
我有一个向量 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 运行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];
您将获得 start
和 finish
的正确输出。