我很确定应该有一个优雅的解决方案(在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)];
答案 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]],:);
由于始终包含第一个项目,差异向量以第一个元素与第二个元素的差异开始,我们需要在列表中添加一个真值。