找出2个向量是否有4个连续的相同元素

时间:2015-11-17 10:23:35

标签: matlab vector

我试图比较2个向量,以发现它们是否共享4个连续值。

例如

w = [6 7 8 9 10 11 12 13 14]
v = [5 6 7 8 9]

有4个连续值6 7 8 9

但是

x = [6 7 8 9 10 11 12 13 14]
y = [6 7 1 2 3 4 5 6 13 14]

有四个相同的值(6 7 13 14),但它们不是连续的。

我目前使用的代码是:

if length(intersect(v, w)) >= 4
    condition = true;

但是这并没有测试连续的元素,因此对于上面列出的两种情况都会返回true,而我希望它只返回true第一种情况。

有人可以帮我找到一种方法来测试相同的连续元素,而不仅仅是相同的元素。

4 个答案:

答案 0 :(得分:1)

立足于马科斯的回答:

  1. 从您的初始搜索中创建所有可能的搜索向量(即[5 6 7 8] [6 7 8 9]) - 但我们会将其设为 m -by-的3D矩阵 1 -by- n

    n = 4;
    m = numel(v)-n+1;
    V = permute(v(bsxfun(@plus,(0:m-1)',1:n)),[1,3,2])
    
  2. 检查这些子矢量中的任何一个是否是被搜索矢量的子集

    check = sum(any(bsxfun(@eq, V, w),3),2) >= n;
    match = squeeze(V(check,:,:))'  %'// The ' is debatable here, it depends on how many matches you get
    

答案 1 :(得分:1)

你可以比较

android:layout_height="fill_parent"
android:layout_width="fill_parent"

导致

bsxfun(@eq, w,v')

如您所见,四个连续匹配元素形成长度为4的对角线 要查找此对角线的位置,您可以ans = 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 使用4对角滤镜(conv2):

eye(4)

补偿过滤器的中心

[rr cc] = find( conv2( single(bsxfun(@eq, [1 2 3 w],v')), eye(4), 'same' ) == 4 )

产生

loc_in_w = cc - 1
loc_in_v = rr - 1

分别是 loc_in_w = 1 loc_in_v = 2 w中序列的第一个索引。

此方法可以在v中多次出现v的4子串...

答案 2 :(得分:0)

我没有在matlab中干涉多年,但我在计算方面的“一般”方法是将问题分解为包含两个部分的针和大海捞针解决方案:

  1. 从初次搜索中创建所有可能的搜索向量(即[5 6 7 8] [6 7 8 9])
  2. 检查这些子矢量中的任何一个是否是被搜索矢量的子集。
  3. 基本上只是连续两次设置操作。

答案 3 :(得分:0)

您可以将矢量转换为字符串,然后使用x。 如果yx_str = mat2str(x); y_str = mat2str(y); n = strfind(x_str(2:end-1), y_str(2:end-1)) 是您的向量:

Array

请注意,您必须删除字符串版本的第一个和最后一个字符,因为它们对应于向量的方括号。