我有一长串的1和0的二进制数据,我想找到它变化时的索引。
a = [ 1 1 1 1 1 0 0 0 0 0 0 1 1]
我想搜索[1 0]
和[0 1]
来查找转换点。如果可能的话,我想避免长循环找到这些。有任何想法吗?
答案 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 ...
位于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]
,其中'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)形式计算两个序列的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
。
更简单的方法是使用strfind
,利用未记录的这个函数可以应用于数字向量:
result = strfind(a, pattern);