两个阵列的模式匹配和自动完成

时间:2016-09-09 07:20:45

标签: arrays matlab pattern-matching

假设我有一个数组:

[0, -2, 0,  0,  -3,  0,  -1,  0,  1,  0,  3,  0,  2,  0,  0,  0]

我想知道它是否适合下面的模式:

[1, 1, 1 , 0, 0 , 0 , 0, 0, 1, 1, 1, 0, 0, 0, 0, 0];

其中1表示该数字是唯一的,0表示所有这些数字都匹配。如果我这样安排,我们会有一场比赛:

[-3, -2, -1,  0,  0,  0,  0,  0,  1,  2,  3,  0,  0,  0,  0,  0];

是否有任何Matlab功能,或者我必须以自己的方式思考?

3 个答案:

答案 0 :(得分:1)

正如你在评论中所说,你可以把任何唯一的数字放在1,而且所有不是零的数字都是唯一的,所以我认为以下是这样的:

A = [0, -2,  0,  0,  -3,  0,  -1,  0,  1,  0,  3,  0,  2,  0,  0,  0];
B = [1, 1, 1 , 0, 0 , 0 , 0, 0, 1, 1, 1, 0, 0, 0, 0, 0];

B(B==1)= A(A~=0)

给出了这个:

B =
-2  -3  -1   0   0   0   0   0   1   3   2   0   0   0   0   0

要匹配问题中您的确切输出,您可以使用以下内容:

A = [0, -2,  0,  0,  -3,  0,  -1,  0,  1,  0,  3,  0,  2,  0,  0,  0];
B = [1, 1, 1 , 0, 0 , 0 , 0, 0, 1, 1, 1, 0, 0, 0, 0, 0];

A=sort(A);
B(B==1)= A(A~=0)

给出了这个:

B =
-3  -2  -1   0   0   0   0   0   1   2   3   0   0   0   0   0

答案 1 :(得分:1)

假设:

ind = logical([1, 1, 1 , 0, 0 , 0 , 0, 0, 1, 1, 1, 0, 0, 0, 0, 0]);

你可以写:

B = zeros(size(ind)); % only if the zeros at the end of 'B' are important    
B(ind) = nonzeros(A)

因此,您使用ind作为逻辑索引来排序0中不是A的元素,以获取:

B =

  -2  -3  -1   0   0   0   0   0   1   3   2   0   0   0   0   0

如果您还想对其进行排序(如您的示例所示),请将最后一行替换为:

B(ind) = nonzeros(sort(A))

答案 2 :(得分:1)

对我而言,感觉就像是插值问题,所以我认为以下将是一个强大的解决方案:

%// data
A = [0, -2, 0,  0,  -3,  0,  -1,  0,  1,  0,  3,  0,  2,  0,  0,  0]
B = [1, 1, 1 , 0, 0 , 0 , 0, 0, 1, 1, 1, 0, 0, 0, 0, 0]

%// input data for interpolation
x  = 1:numel(A)
v = A;
%// query points
mask = logical(B) & ~logical(A);
xq = find( mask )
%// interpolation
vq = interp1(x(~mask),v(~mask),xq,'linear','extrap')

%// output
out = A.*B;
out(xq) = vq
out =

    -3   -2   -1    0    0    0    0    0    1    2    3    0    0    0    0    0