多个阵列模式匹配

时间:2016-09-09 10:25:55

标签: matlab pattern-matching

让我们说我有一个数组:

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

我想知道它是否适合以下任何模式:

B = [1, 1, 1 , 0, 0 , 0 , 0, 0,];
C= [1, 1, 0 , 1, 0 , 0 , 0, 0,]
D= [0, 1, 0 , 1, 0 , 1 , 0, 0];

其中1表示该数字是唯一的,0表示该数字保持不变,直到满足另一个1,但与之前的数字不同。以下是一些例子:

[-3, -2, -1, 0, 0, 0, 0, 0]; --- A matches B.
[-3, -2, -1, -1, 0, 0, 0, 0]; -- This matches C
[-3, -3, 3, 3, -2, -2, 0, 0]; -- This matches D

是否有任何Matlab功能,或者我必须以自己的方式思考?任何建议,我对Matlab都很陌生。

1 个答案:

答案 0 :(得分:0)

您的规则有问题,您似乎将0视为特殊情况(即,它不是数字或其他内容)。

你可以做这样的事情:

A=[-3, -2, -1, -1, 0, 0, 0, 0];
[ia ib] = unique(A);
R = zeros(1,8);
R(ib) = 1

>> R =

 1     1     0     1     0     0     0     1

并匹配此,假设您将0视为一个数字,就像您在规则中所述。

如果您希望0为特殊情况,则需要:

A=[-3, -2, -1, -1, 0, 0, 0, 0];
[ia ib] = unique(A);
ib(ia==0)=[];
R = zeros(1,8);
R(ib) = 1

>> R =

 1     1     0     1     0     0     0     0

并简单地将此向量与您的B,C,D等匹配。第二种方法与您想要的答案匹配,但与您声明的规则不匹配。第一种方法匹配您所声明的规则,但不匹配您想要的输出。

============= EDIT ============

我在2010b和时间线的某个时间,unique的工作方式发生了变化,如果您使用的是2012b以上的任何版本,则需要添加legacy

抱歉,我忘记提及:

只需将其更改为:

[ia ib] = unique(A,'legacy');

它应该可以正常工作。