3

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

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

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

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

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

4

3 回答 3

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
于 2013-03-26T03:51:13.127 回答
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 调用,因为您需要绝对索引。

于 2013-03-26T09:33:43.350 回答
0

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

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

于 2013-03-26T08:23:21.050 回答