【问题标题】:Find location of a pattern of bits in a binary array in matlab在matlab中查找二进制数组中位模式的位置
【发布时间】:2015-08-03 04:01:05
【问题描述】:

我有一个二进制数据数组,其中包含很长的一和零,我想找到它何时变化的索引。

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

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

【问题讨论】:

  • 你肯定想使用diff函数。

标签: arrays matlab binary pattern-matching


【解决方案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 添加到结果索引数组中。

【讨论】:

  • 感谢您这么快回复!这很好用:)
【解决方案2】:

我会去的

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]

【讨论】:

  • d = a(1:end-1) - a(2:end); 可以简化为d = -diff(a);
  • 这两个选项在性能/速度上有什么区别吗?
【解决方案3】:

要搜索零和一的任意模式

  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);
    

【讨论】:

  • 感谢您的回答,我会记住这一点,以防我需要找到更长的模式。
  • 我没有运行任何基准测试,但我猜你使用conv 的方法比我的更有效。
  • @Jubobs 我对此表示怀疑。对于特定的 OP 案例([1 0 ][0 1]diff 应该非常快
  • 我选择了 diff,因为我只是在寻找长序列的 1 和 0(有效标志的数组)的变化,但这看起来是寻找其他模式的好选择。再次感谢
  • @ErinGoBragh 欢迎您!对于您的具体情况,这也是我的首选方法
猜你喜欢
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
相关资源
最近更新 更多