整理清单

时间:2010-03-16 14:18:24

标签: matlab

我很确定应该有一个优雅的解决方案(在MATLAB中),但我现在想不到它。

我有[classIndex,start,end]的列表,我想将连续的类索引折叠成一个组,如下所示:

 1     1    40
 2    46    53
 2    55    55
 2    57    64
 2    67    67
 3    68    91
 1    94   107

应该变成这个

 1     1    40
 2    46    67
 3    68    91
 1    94   107

我该怎么做?

修改

没关系,我想我得到了它 - 它几乎就像fmarc's solution,但得到了正确的指数

a=[  1     1    40
     2    46    53
     2    55    55
     2    57    64
     2    67    67
     3    68    91
     1    94   107];

d = diff(a(:,1));
startIdx = logical([1;d]);
endIdx   = logical([d;1]);
b = [a(startIdx,1),a(startIdx,2),a(endIdx,3)];

2 个答案:

答案 0 :(得分:2)

这是一个解决方案:

Ad = find([1; diff(A(:,1))]~=0);
output = A(Ad,:);
output(:,3) = A([Ad(2:end)-1; Ad(end)],3);
clear Ad

答案 1 :(得分:1)

如果相关列是数字,则可以使用以下方法: 沿id列构建差异。连续相同的项目在此处为零:

diffind = diff(a(:,1)');

使用它来索引您的数组,使用逻辑索引。

b = a([true [diffind~=0]],:);

由于始终包含第一个项目,差异向量以第一个元素与第二个元素的差异开始,我们需要在列表中添加一个真值。