1

如果我有序列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) 所以可能没有更平滑的了。

如果你能找到另一种方法,我很感兴趣。

4

3 回答 3

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
于 2013-05-16T18:32:56.403 回答
2

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
于 2013-05-16T18:36:07.753 回答
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 会是 amx 吗?具有 m 行和任何返回位置的矩阵。但是,如果正确位置没有零,您可能会得到 NaN ... 或错误。没有机会测试。

于 2013-05-16T19:55:28.457 回答