我试图比较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
第一种情况。
有人可以帮我找到一种方法来测试相同的连续元素,而不仅仅是相同的元素。
答案 0 :(得分: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])
检查这些子矢量中的任何一个是否是被搜索矢量的子集
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中干涉多年,但我在计算方面的“一般”方法是将问题分解为包含两个部分的针和大海捞针解决方案:
基本上只是连续两次设置操作。
答案 3 :(得分:0)
您可以将矢量转换为字符串,然后使用x
。
如果y
和x_str = mat2str(x);
y_str = mat2str(y);
n = strfind(x_str(2:end-1), y_str(2:end-1))
是您的向量:
Array
请注意,您必须删除字符串版本的第一个和最后一个字符,因为它们对应于向量的方括号。