在matlab中查找二进制数组中位模式的位置

Find location of a pattern of bits in a binary array in matlab

我有一个包含长长的 1 和 0 的二进制数据数组,我想找到它何时发生变化的索引。

a = [ 1 1 1 1 1 0 0 0 0 0 0 1 1]

我想搜索 [1 0][0 1] 以找到过渡点。如果可能的话,我想避免长循环来找到这些。有任何想法吗?

像这样的东西应该可以完成工作:

b = diff(a);                     % (assuming 'a' is a vector)
oneFromZero = find(b ==  1) + 1; % vector of indices of a '1' preceded by a '0'
zeroFromOne = find(b == -1) + 1; % vector of indices of a '0' preceded by a '1'

根据您的具体需要,您可能希望或不希望将 1 添加到生成的索引数组中。

我会选择

d = a(1:end-1) - a(2:end);
ind = find(d);

此处,d 将是 1,其中您的位串中有一个 ... 1 0 ...,它将是 -1,您的位串中有一个 ... 0 1 ... . d 中的所有其他元素将是 0,因为在这些位置,这些位等于它们的邻居。

有了这个,您可以使用 find 来获取出现这两种模式的索引。整个过程 O(n) 复杂,其中 n=length(a),因为它需要通过 a.

两次

对于 a = [ 1 1 1 1 1 0 0 0 0 0 0 1 1] 上面的代码计算 ind = [5 11].

搜索 0 和 1 的任意模式:

  1. 您可以计算 bipolar (±1) 形式的两个序列的 convolution (conv),然后找到最大值。由于卷积翻转其中一个输入,因此必须 翻转 才能撤消:

    a = [ 1 1 1 1 1 0 0 0 0 0 0 1 1];
    pattern = [0 1 1];
    result = find(conv(2*a-1, 2*pattern(end:-1:1)-1, 'valid')==numel(pattern));
    

    在这个例子中

    result =
        11
    

    这意味着 [0 1 1] 只在 a 中出现一次,即在索引 11.

  2. 一种更简单的方法是使用 strfind,利用 未记录的 这个函数可以应用于数字向量的事实:

    result = strfind(a, pattern);