假设我有一个只包含逻辑值的向量,例如
V = [1 0 1 0 1 1 1 1 0 0]
我想在 MATLAB 中编写一个函数,它返回一个 'streak' 向量S
,V
其中 S(i) 表示 V 中连续 1 的数量,但不包括 V(i)。对于上面的示例,条纹向量将是
S = [0 1 0 1 0 1 2 3 4 0]
鉴于我必须为一个非常大的矩阵执行此操作,我非常感谢任何矢量化/高效的解决方案。
假设我有一个只包含逻辑值的向量,例如
V = [1 0 1 0 1 1 1 1 0 0]
我想在 MATLAB 中编写一个函数,它返回一个 'streak' 向量S
,V
其中 S(i) 表示 V 中连续 1 的数量,但不包括 V(i)。对于上面的示例,条纹向量将是
S = [0 1 0 1 0 1 2 3 4 0]
鉴于我必须为一个非常大的矩阵执行此操作,我非常感谢任何矢量化/高效的解决方案。
这应该可以解决问题:
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
您也可以通过几个中间步骤将其完全矢量化:
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 调用,因为您需要绝对索引。
它在盒子外面 - 但是您是否考虑过使用文本功能?由于字符串只是 Matlab 的向量,因此应该很容易使用它们。
Regexp 包含一些用于查找重复值的不错的函数。