如果我有序列1 0 0 0 1 0 1 0 1 1 1
如何有效地定位来自双方的零1。
在这个序列中,它表示位置6和8为零。粗体表示。
1 0 0 0 1 0 1 0 1 1 1
我可以想象算法可以循环遍历数组,然后看一个在后面,一个在前面我猜这意味着O(n)所以可能没有更平滑的算法。
如果你能找到另一种方式,我很感兴趣。
答案 0 :(得分:5)
使用strfind
:
pos = strfind(X(:)', [1 0 1]) + 1
请注意,仅当X
为向量时才会有效。
X = [1 0 0 0 1 0 1 0 1 1 1 ];
pos = strfind(X(:)', [1 0 1]) + 1
结果:
pos =
6 8
答案 1 :(得分:2)
@EitanT建议的strfind
方法非常好。另一种方法是使用find
和逐元素位操作:
% let A be a logical ROW array
B = ~A & [A(2:end),false] & [false,A(1:end-1)];
elements = find(B);
根据您的示例,假设您要排除边界元素。需要使用连接[A(2:end),false]
和[false,A(1:end-1)]
来保持数组长度相同。如果记忆是一个问题,可以消除这些:
% NB: this will work for both ROW and COLUMN vectors
B = ~A(2:end-1) & A(3:end) & A(1:end-2);
elements = 1 + find(B); % need the 1+ because we cut off the first element above
答案 2 :(得分:0)
...并详细说明@Eitan T的答案,如果你逐行循环,你可以使用strfind作为数组
% let x = some matrix of 1's and 0's (any size)
[m n] = size(x);
for r = 1:m;
pos(r,:) = strfind(x(r,:)',[1 0 1]) + 1;
end
pos会是m x吗?具有m行和任何返回位置的矩阵。如果在适当的位置没有零,你可能会得到一个NaN ......或者一个错误。没有机会进行测试。