如果我有序列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) 所以可能没有更平滑的了。
如果你能找到另一种方法,我很感兴趣。
如果我有序列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) 所以可能没有更平滑的了。
如果你能找到另一种方法,我很感兴趣。
使用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
strfind
@EitanT 建议的方法非常好。另一种方法是使用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
...并详细说明@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 会是 amx 吗?具有 m 行和任何返回位置的矩阵。但是,如果正确位置没有零,您可能会得到 NaN ... 或错误。没有机会测试。