我有一个1和0的数组A,想看看更大的B位数是否包含那些确切顺序的位? 示例:A = [0 1 1 0 0 0 0 1]
B = [0 1 0 0 1 1 0 0 0 0 1 0 1 0 1] 当A包含在B
中时,它将是真的我发现的大多数解决方案只能确定某个值是否包含在另一个矩阵中,这在这里并不好,因为已经确定两个矩阵都是1和0 感谢
答案 0 :(得分:0)
一个(虽然不常见)选项,因为您正在处理整数值,是将A
和B
转换为字符数组并使用contains
函数:
isWithin = contains(char(B), char(A));
答案 1 :(得分:0)
有一些钝的矢量化方法可以做到这一点,但到目前为止最简单,也可能同样有效的方法是使用带滑动窗口的循环,
A = [0 1 1 0 0 0 0 1];
B = [0 1 0 0 1 1 0 0 0 0 1 0 1 0 1];
vec = 0:(numel(A)-1);
for idx = 1:(numel(B)-numel(A)-1)
if all(A==B(idx+vec))
fprintf('A is contained in B\n');
break; % exit the loop as soon as 1 match is found
end
end
或者如果您想知道B中的位置(可能是多个匹配),那么,
A = [0 1 1 0 0 0 0 1];
B = [0 1 0 0 1 1 0 0 0 0 1 0 1 0 1];
C = false(1,numel(B)-numel(A)-1);
vec = 0:(numel(A)-1);
for idx = 1:numel(C)
C(idx) = all(A==B(idx+vec));
end
if any(C)
fprintf('A is contained in B\n');
end
在这种情况下
>> C
C =
1×6 logical array
0 0 0 1 0 0
答案 2 :(得分:0)
您可以在两个信号之间使用cross-correlation来衡量本地相似度。
为了获得良好的效果,您需要移动A和B,以便不再具有值0。然后使用Off
计算两者之间的相关性(记住卷积是一个信号翻转的互相关),并用A的能量进行归一化,这样每当你得到一个完美的匹配值1:
conv
在标准化术语中,删除翻转,因为它不会更改值。
它给出了:
conv(B-0.5, flip(A)-0.5, 'valid')/sum((A-0.5).^2)
第4个元素是1,所以从索引等于4开始,你得到一个完美的匹配。