在MATLAB中计算连续整数条纹的有效方法

时间:2013-03-26 03:30:09

标签: matlab

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

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

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

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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调用,因为你需要绝对索引。

答案 2 :(得分:0)

它不在盒子里 - 但你考虑过使用文字功能吗?由于字符串只是Matlab的向量,因此应该很容易使用它们。

Regexp包含一些很好的函数来查找重复值。