如何查看matlab中另一个数组是否包含数组(按相同顺序)?

时间:2018-03-21 03:17:41

标签: arrays matlab matrix contains

我有一个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 感谢

3 个答案:

答案 0 :(得分:0)

一个(虽然不常见)选项,因为您正在处理整数值,是将AB转换为字符数组并使用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开始,你得到一个完美的匹配。