测试unique

%%随机生成16个9位二进制码按顺序赋给下列的单元格
A=randperm(512);
B=A(1:16);
M=[];
N=[];%用于存储联合的18位
for i=1:16
    a=dec2bin(B(i),9);
    M=[M;a]
end
%%测试是不是唯一码
for i=1:12
    if mod(i,4)~=0
        temp1=strcat(M(i,:),M(i+1,:))
        temp2=strcat(M(i+1,:),M(i,:))
        temp3=strcat(M(i,:),M(i+4,:))
        temp4=strcat(M(i+4,:),M(i,:))
        N=[N;temp1;temp2;temp3;temp4]
    else
        temp1=strcat(M(i,:),M(i+4,:));
        temp2=strcat(M(i+4,:),M(i,:));
        N=[N;temp1;temp2];
    end
end
for i=13:15
    temp1=strcat(M(i,:),M(i+1,:));
    temp2=strcat(M(i+1,:),M(i,:));
    N=[N;temp1;temp2];
end
N
num1=length(N)
num2=length(unique(N,'rows'))
if num1~=num2
    fprintf('不是唯一码')
else
    fprintf('是唯一码')
end

 

 

 

测试两个人的情况,已经修改了

%%该函数为测试4*4的格数,两个人的情况(这两个人是相同的)
%%输入量B为待测的16个动态唯一码,obit为每个动态唯一码的位数
%%输出结果result为1则该测试的码是动态唯一可解码,为0则不是
%%注意一下函数只能测试16个的动态唯一码都是不相同的
%如若:B=[83   777   464   274   360   292   141   708   664   641    14   261   112   550   200    20];
%则测试函数为:result=test(B,obit);其中obit=10;
%B=2.^(0:15);类同
function result=test_unique(B,obit)
result=inf;
M=[];
N=[];%用于存储联合的18位
R=[];%存放结果
dbit=2*obit;
for i=1:16
    a=dec2bin(B(i),obit);
    M=[M;a];
end
%%测试是不是唯一码
for i=1:12
    %%针对1,2.。。12
    if mod(i,4)~=0
        temp1=strcat(M(i,:),M(i+1,:));
        temp2=strcat(M(i+1,:),M(i,:));
        temp3=strcat(M(i,:),M(i+4,:));
        temp4=strcat(M(i+4,:),M(i,:));
        N=[N;temp1;temp2;temp3;temp4];
    else
        temp1=strcat(M(i,:),M(i+4,:));
        temp2=strcat(M(i+4,:),M(i,:));
        N=[N;temp1;temp2];
    end
end
%%剩余的13,14,15
for i=13:15
    temp1=strcat(M(i,:),M(i+1,:));
    temp2=strcat(M(i+1,:),M(i,:));
    N=[N;temp1;temp2];
end
%针对不动点
for i=1:16
    temp1=strcat(M(i,:),M(i,:));
    N=[N;temp1];
end
N;
num1=length(N);
%%以下是找一个组合,达到满足约束条件
for i=1:num1
    for j=i+1:num1
        if (bin2dec(N(i,1:obit))~=bin2dec(N(j,1:obit)))&(bin2dec(N(i,obit+1:dbit))~=bin2dec(N(j,obit+1:dbit)))%排除两个人起点或终点相同的情况
            if ~(bin2dec(N(i,1:obit))==bin2dec(N(i,obit+1:dbit))&bin2dec(N(j,1:obit))==bin2dec(N(j,obit+1:dbit)))%%排除两个人都不动的情况
                if bin2dec(N(i,1:obit))~=bin2dec(N(j,obit+1:dbit))&bin2dec(N(i,obit+1:dbit))~=bin2dec(N(j,1:obit))%%排除两个人直线相邻互相向对方走的情况
                    a=bin2dec(N(i,:));
                    b=bin2dec(N(j,:));
                    t=dec2bin(bitor(a,b),dbit);
                    R=[R;t];
                end
            end
        end
    end
end
num2=length(R);
temp=unique(R,'rows');
num3=length(unique(R,'rows'));
num3=num3+18 ; %%排除相邻对角的情况,共有18种
if  num3==num2
    %     fprintf('是唯一码')
    result=1;
else
    %     fprintf('不是唯一码')
    result=0;
end

你可能感兴趣的:(测试unique)