Script Matlab grille nxn
Dernière modification
17/03/2015 14:43
—
Ce script matlab permet d'obtenir tous les numéros associés à chaque patron, dans toutes ces configurations possibles dans une grille nxn. Ce paramètre est à régler au début du script.
Cliquez ici pour obtenir le fichier
Taille 6.3 kB - Type du fichier text/x-objcsrcContenu du fichier
clc clear all n=4; %c'est la dimension for k=1:n M(n+1-k,k)=1; end % ResultatM=zeros(16,1); %Insertion des patrons dans la matrice PatronM pour les patrons de 1 à 10 %Par paquet de 6 colonnes --> tous les patrons d'un même cube %nombre de positions possibles G=(n-4+1)*(n-3+1); PatronM=zeros(G*n,11*n); %On entre tous les patrons possibles avec avec les 2t vers la droite et 3 %vers le bas. Pour cela, on impose que les 10 premiers patrons occupent 3 %lignes et 4 colonnes. p=1; %Patron 1 PatronM(1:3,(p-1)*n+1:(p-1)*n+4)=[1 0 0 0;1 1 1 1;1 0 0 0]; p=p+1; %Patron 2 PatronM(1:3,(p-1)*n+1:(p-1)*n+4)=[1 1 0 0; 0 1 1 0;0 0 1 1]; p=p+1; %Patron 3 PatronM(1:3,(p-1)*n+1:(p-1)*n+4)=[0 0 0 1;1 1 1 1;1 0 0 0]; p=p+1; %Patron 4 PatronM(1:3,(p-1)*n+1:(p-1)*n+4)=[0 1 0 0;1 1 1 1;0 1 0 0]; p=p+1; %Patron 5 PatronM(1:3,(p-1)*n+1:(p-1)*n+4)=[1 1 0 0;0 1 1 1;0 1 0 0]; p=p+1; %Patron 6 PatronM(1:3,(p-1)*n+1:(p-1)*n+4)=[0 1 0 0;1 1 1 1;1 0 0 0]; p=p+1; %Patron 7 PatronM(1:3,(p-1)*n+1:(p-1)*n+4)=[0 0 1 0;1 1 1 1;0 1 0 0]; p=p+1; %Patron 8 PatronM(1:3,(p-1)*n+1:(p-1)*n+4)=[0 1 0 0;1 1 1 0;0 0 1 1]; p=p+1; %Patron 9 PatronM(1:3,(p-1)*n+1:(p-1)*n+4)=[1 1 0 0;0 1 1 1;0 0 0 1]; p=p+1; %Patron 10 PatronM(1:3,(p-1)*n+1:(p-1)*n+4)=[0 0 1 0;1 1 1 1;1 0 0 0]; p=p+1; %Patron 11 PatronM(1:2,(p-1)*n+1:(p-1)*n+5)=[1 1 1 0 0;0 0 1 1 1]; %Insertion des translations for p=1:11 %sur les 10 patrons if p<11 num=0; for c=0:n-4%translation vers la droite for l=0:n-3%translation vers le bas PatronM(num*n+l+1:num*n+l+3,c+(p-1)*n+1:c+(p-1)*n+4)=PatronM(1:3,(p-1)*n+1:(p-1)*n+4); num=num+1; end end else num=0; for c=0:n-5%translation vers la droite for l=0:n-2%translation vers le bas PatronM(num*n+l+1:num*n+l+2,c+(p-1)*n+1:c+(p-1)*n+5)=PatronM(1:2,(p-1)*n+1:(p-1)*n+5); num=num+1; end end end end PatronM PatronM; for p=1:11 % On effectue tous les calculs sur les 10 patrons P=PatronM(1:n,(p-1)*n+1:p*n); R=zeros(n,G*n*8); %On stock tous les patrons possibles 12 translations*8transformations!! S=zeros(G*8,1);% Obtention de tous les résultats en base 10 en colonne for m=1:G%stock les 8 transformations de chaque translations dans la matrice R %Calculs intermédiaires pour aider matlab A=PatronM((m-1)*n+1:m*n,(p-1)*n+1:p*n); %n par n B=A'; C=(M*A)'; for t=1:8 if t==1%Identité T=A; R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T; for k=0:n^2-1 S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1); end elseif t==2%Symétrie horizontale T=M*A; R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T; for k=0:n^2-1 S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1); end elseif t==3%Symétrie verticale T=A*M; R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T; for k=0:n^2-1 S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1); end elseif t==4%Symétrie centrale T=M*A*M; R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T; for k=0:n^2-1 S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1); end elseif t==5%Symétrie axiale \ T=B; R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T; for k=0:n^2-1 S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1); end elseif t==6%Symétrie axiale / T=M*C; R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T; for k=0:n^2-1 S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1); end elseif t==7%Rotation +90 T=M*B; R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T; for k=0:n^2-1 S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1); end elseif t==8%Rotation -90 T=B*M; R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T; for k=0:n^2-1 S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1); end end end end R; S; %Enlève les doublons for k=1:G*8 for i=k+1:G*8 if S(k,1)==S(i,1) S(k,1)=0; end end end S; %Ordre décroissant for k=1:G*8 for i=k:G*8 if S(k,1)<S(i,1) b=S(k,1); S(k,1)=S(i,1); S(i,1)=b; end end end S; %Compte le nombre de zeros avec h initialisé à 0 h=0; for k=1:G*8 if S(k,1)==0 h=h+1; end end h; Resultat=zeros(G*8-h,1); for k=1:G*8-h Resultat(k,1)=S(k,1); end % %Ordre croissant % for k=1:(16-h)/2 % p=Resultat(k,1); % Resultat(k,1)=Resultat(16-h-k,1); % Resultat(16-h-k+1,1)=p; % end sprintf('Patron %d',p) P Resultat; % ordre décroissant for k=1:G*8-h str=sprintf('(a-%f)*',Resultat(k,1)); disp(str); end end