【问题标题】:Effiicient ways to count a streak of consecutive integers in MATLAB在 MATLAB 中计算一连串连续整数的有效方法
【发布时间】:2013-03-26 03:30:08
【问题描述】:

假设我有一个只包含逻辑值的向量,例如

V = [1 0 1 0 1 1 1 1 0 0]

我想在 MATLAB 中编写一个函数,它为 V 返回一个“连续”向量 S,其中 S(i) 表示 V 中连续 1 的数量,但不包括 V(i)。对于上面的示例,条纹向量将是

S = [0 1 0 1 0 1 2 3 4 0] 

鉴于我必须为一个非常大的矩阵执行此操作,我非常感谢任何矢量化/高效的解决方案。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    这应该可以解决问题:

    S = zeros(size(V));
    for i=2:length(V)
        if(V(i-1)==1)
            S(i) = 1 + S(i-1);
        end
    end
    

    复杂度只有O(n),我想应该足够好了。

    对于您的示例输入:

    V = [1 0 1 0 1 1 1 1 0 0];
    S = zeros(size(V));
    for i=2:length(V)
        if(V(i-1)==1)
            S(i) = 1 + S(i-1);
        end
    end
    display(V);
    display(S);
    

    结果是:

    V =
    
         1     0     1     0     1     1     1     1     0     0
    
    
    S =
    
         0     1     0     1     0     1     2     3     4     0
    

    【讨论】:

    • 我应该更清楚 S(i) 应该 以任何方式与 V(i) 绑定。我已经更改了上面的示例,但我认为如果您调整索引,您的解决方案就可以工作 - 对吧?
    • @BerkU.:好的,但在这种情况下 S(2)S(4) 不应该是 1 吗?
    【解决方案2】:

    您也可以通过几个中间步骤将其完全矢量化:

    V = [1 0 1 0 1 1 1 1 0 0];
    
    Sall = cumsum(V);
    stopidx = find(diff(V)==-1)+1;
    V2=V;
    V2(stopidx) = -Sall(stopidx)+[0 Sall(stopidx(1:end-1))];
    S2 = cumsum(V2);
    
    S = [0 S2(1:end-1)];
    

    Afaik 唯一需要一段时间的是find 电话;您不能在任何地方都使用逻辑索引并绕过 find 调用,因为您需要绝对索引。

    【讨论】:

      【解决方案3】:

      它在框外 - 但您是否考虑过使用文本功能?由于字符串只是 Matlab 的向量,因此应该很容易使用它们。

      Regexp 包含一些用于查找重复值的不错的函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多