我想知道是否有一种简单的方法可以在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
但是当一个元素重复三次或更多次时,我没有找到一种简单的概括方法。提前谢谢。
答案 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