假设我有一个仅包含逻辑值的向量,例如
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]
鉴于我必须为一个非常大的矩阵做这个,我非常感谢任何矢量化/高效的解决方案。
答案 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包含一些很好的函数来查找重复值。