代码之家  ›  专栏  ›  技术社区  ›  Jonas

整理清单

  •  3
  • Jonas  · 技术社区  · 15 年前

    我很确定应该有一个优雅的解决方案(在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 回复  |  直到 15 年前
        1
  •  2
  •   yuk    15 年前

    以下是一个解决方案:

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

    如果所讨论的列是数字,则执行此操作的一种方法是: 沿着id列构建差异。连续的相同项在此处将为零:

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

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

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

    由于第一项总是包含在内,并且差异向量以第一个元素到第二个元素之间的差异开始,所以我们需要在列表前加上一个真值。