在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 的任意模式:
您可以计算 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
.
一种更简单的方法是使用 strfind
,利用 未记录的 这个函数可以应用于数字向量的事实:
result = strfind(a, pattern);
我有一个包含长长的 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 的任意模式:
您可以计算 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
.一种更简单的方法是使用
strfind
,利用 未记录的 这个函数可以应用于数字向量的事实:result = strfind(a, pattern);