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

时间:2015-05-21 12:59:14

标签: arrays matlab binary pattern-matching

我有一长串的1和0的二进制数据,我想找到它变化时的索引。

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

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

3 个答案:

答案 0 :(得分:6)

这样的事情应该可以胜任:

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添加到结果索引数组中。

答案 1 :(得分:2)

我会去

d

此处1... 1 0 ...,您的位字符串中有-1... 0 1 ...位于d0find O(n)中的所有其他元素都将是n=length(a),因为在这些位置,这些位等于它们的邻居。

有了这个,您可以使用a来获取这两个模式出现的索引。整个过程的a = [ 1 1 1 1 1 0 0 0 0 0 0 1 1]复杂度为ind = [5 11],其中'doctor_Weiss.csv', 'doctor_Urlici.csv', 'doctor_Basler J. Rudolph.csv',因为它需要两遍'doctor_Weiss.csv', 'doctor_Urlici.csv'

对于'doctor_Basler J. Rudolph.csv',上述代码会计算import os from os.path import join fpA = {} for root, dirs, files in os.walk('C:\A\docs'): for name in files: fpA[name] = 1 fpB = {} for root, dirs, files in os.walk('C:\B\docs'): for name in files: fpB[name] = 1 a = [] for name in fpA.keys(): if not(name in fpB.keys()): a.append(name)

答案 2 :(得分:2)

要搜索任意模式的零和一个

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

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