Matlab求向量中重复元素的区间

Matlab求向量中重复元素的区间,matlab,sorting,indexing,Matlab,Sorting,Indexing,我想知道在Matlab中是否有一种简单的方法来执行以下操作。假设我有一个向量: >> DataVector = [ 1 2 3 3 4 4 4 4 5 6 6 ] 我想找到一个函数,对于每个重复的元素,它返回序列的第一个和最后一个索引。因此,对于DataVector我想要如下内容: >> Intervals = ComputeIntervals(DataVector) Intervals = 3 4 5 8 10 11 对于每个元素重复不超过两次的简单情况,我

我想知道在Matlab中是否有一种简单的方法来执行以下操作。假设我有一个向量:

>> DataVector = [ 1 2 3 3 4 4 4 4 5 6 6 ]
我想找到一个函数,对于每个重复的元素,它返回序列的第一个和最后一个索引。因此,对于
DataVector
我想要如下内容:

>> Intervals = ComputeIntervals(DataVector)
Intervals =
 3  4
 5  8
10 11
对于每个元素重复不超过两次的简单情况,我找到了这个解决方案

>> DataVector = [ 1 2 3 3 4 4 5 6 6 ]
Intervals(:,1) = find(diff(DataVector) == 0)
Intervals(:,2) = find(diff(DataVector) == 0) + 1
但是,当一个元素像一般情况一样重复三次或更多次时,我没有找到一个简单的方法来概括。提前感谢。

从改编为:


如您的示例所示,如果这些值只能在一次运行中重复(因此允许
[1 2 2 3 3 4]
,但不允许
[1 2 2 2 1 4]
),也可以使用以下方法:

[~, starts] = unique(DataVector(:),'first'); %// first occurrence of each value
[~, ends] = unique(DataVector(:),'last');  %// last occurrence of each value
result = [starts ends];
result = result(diff(result,[],2)~=0,:);  %// keep only runs of length greater than 1
[~, starts] = unique(DataVector(:),'first'); %// first occurrence of each value
[~, ends] = unique(DataVector(:),'last');  %// last occurrence of each value
result = [starts ends];
result = result(diff(result,[],2)~=0,:);  %// keep only runs of length greater than 1