【问题标题】:Start/stop values for blocks of consecutive numbers连续数字块的开始/停止值
【发布时间】:2016-03-06 15:24:39
【问题描述】:

如果我有一个向量:

[4,5,6,7,11,12,13,14,21,22,23]

没有循环,我如何提取所有连续数字块的开始/结束值,即上述向量的期望结果将是一个 2 列向量:

b = 

4   7
11  14
21  23

【问题讨论】:

    标签: matlab indexing


    【解决方案1】:

    另一种方法:

    x = [4,5,6,7,11,12,13,14,21,22,23];
    x = x(:);
    ind = find([1; diff(x)-1; 1]);
    result = [x(ind(1:end-1)) x(ind(2:end)-1)];
    

    【讨论】:

    • 我正要针对类似问题发布一个新问题:我的向量由零和一组成,但使用find(schedule),我可以得到您正在使用的格式。而不是开始+结束,我需要开始+长度,我通过resultFinal = [result(:,1), result(:,2) - result(:,1) + 1] 获得。非常优雅的代码,省去了for 循环,速度大约是原来的两倍!
    • @rotton 很高兴你发现它有用!
    【解决方案2】:

    简单:

    a = [4,5,6,7,11,12,13,14,21,22,23];
    b = reshape(a(sort([find(a - circshift(a,[0,1]) ~= 1),find(a - circshift(a,[0,-1]) ~= -1)])),2,[])'
    

    输出:

    b =
    
     4     7
    11    14
    21    23
    

    【讨论】:

    • 你有不需要通讯系统工具箱的方法吗?
    • @AnnaSchumann 是的,b = reshape(a(sort([find(a - circshift(a,[0,1]) ~= 1),find(a - circshift(a,[0,-1]) ~= -1)])),[],2)
    • 用a = [2,5,6,7,11,12,13,14,21,22,23]; 我得到b 等于[2 11;2 14;5 21;7 23],这似乎是不正确的
    • @LuisMendo 让我们看看我能做些什么来解决它:)
    • @LuisMendo 已修复 :) 您的案例输出为:[2 2; 5 7; 11 14; 21 23]
    【解决方案3】:

    像这样:

        v  = [4,5,6,7,11,12,13,14,21,22,23];
    
        dv = diff(diff(v)==1);
    
        bv = find(dv==+1)+1;
        if dv(1) == 0
                bv = [1,bv];
        end;
    
        ev = find(dv==-1)+1;
        if dv(end) == 0
                ev = [ev,numel(v)];
        end;
    
        b = v([bv(:),ev(:)]);
    

    【讨论】:

    • v = [2,5,6,7,11,12,13,14,21,22,23]; 这似乎错过了第一个元素
    • @LuisMendo 它会遗漏所有“孤立”的数字(即不属于其中至少有两个数字的连续数字序列)
    【解决方案4】:

    不是最佳答案,但我花了一个小时才得到它,所以我想发布它:

    x = (0:10:a(end))'; %'
    subindex = @(A) [A(1) A(end)];
    fun = @(q) subindex( a(a>q & a<q+10));
    res = cell2mat(arrayfun(fun, x, 'UniformOutput', false));
    

    它适用于任何大小的a。

    【讨论】:

    • 非常好的解决方案。谢谢!
    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    相关资源
    最近更新 更多