有效挑选包围元素

时间:2013-05-16 18:19:23

标签: arrays algorithm matlab matrix-indexing

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

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

3 个答案:

答案 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 ......或者一个错误。没有机会进行测试。