Matlab在向量中找到重复元素的间隔

时间:2015-12-06 17:36:26

标签: 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

对于一个更简单的情况,每个元素重复不超过两次,我找到了这个解决方案

>> DataVector = [ 1 2 3 3 4 4 5 6 6 ]
Intervals(:,1) = find(diff(DataVector) == 0)
Intervals(:,2) = find(diff(DataVector) == 0) + 1

但是当一个元素重复三次或更多次时,我没有找到一种简单的概括方法。提前谢谢。

1 个答案:

答案 0 :(得分:4)

this answer改编为similar question

DataVector = [ 1 2 3 3 4 4 4 4 5 6 6 ];
DataVector = DataVector(:); %// make column vector
ind =  find([1; diff(DataVector); 1]); %// index of each element that differs from the next
result = [ind(1:end-1) ind(2:end)-1]; %// starts and ends of runs of equal values
result = result(diff(result,[],2)~=0,:) %// keep only runs of length greater than 1

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

[~, 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