Matlab: Cómo enumerar las posibles formas de formar pares a partir de una lista
Supongamos que tengo una lista de longitud 2k
, digamos {1,2,...,2k}
. El número de formas posibles de agrupar los 2k
números en k
pares (desordenados) es n(k) = 1*3* ... *(2k-1)
. Entonces k=2
, tenemos las siguientes tres formas diferentes de formar 2 pares
(1 2)(3 4)
(1 3)(2 4)
(1 4)(2 3)
¿Cómo puedo usar Matlab para crear la lista anterior, es decir, crear una matriz n(k)*(2k)
tal que cada fila contenga una forma diferente de agrupar la lista de 2k
números en k
pares?
Respuestas
clear
k = 3;
set = 1: 2*k;
p = perms(set); % get all possible permutations
% sort each two column
[~, col] = size(p);
for i = 1: 2: col
p(:, i:i+1) = sort(p(:,i:i+1), 2);
end
p = unique(p, 'rows'); % remove the same row
% sort each row
[row, col] = size(p);
for i = 1: row
temp = reshape(p(i,:), 2, col/2)';
temp = sortrows(temp, 1);
p(i,:) = reshape(temp', 1, col);
end
pairs = unique(p, 'rows'); % remove the same row
pairs =
1 2 3 4 5 6
1 2 3 5 4 6
1 2 3 6 4 5
1 3 2 4 5 6
1 3 2 5 4 6
1 3 2 6 4 5
1 4 2 3 5 6
1 4 2 5 3 6
1 4 2 6 3 5
1 5 2 3 4 6
1 5 2 4 3 6
1 5 2 6 3 4
1 6 2 3 4 5
1 6 2 4 3 5
1 6 2 5 3 4
Como alguien piensa que mi respuesta anterior no es útil, publico esto.
Tengo la siguiente forma de fuerza bruta de enumerar los pares. No particularmente eficiente. También puede causar problemas de memoria cuando k> 9. En ese caso, puedo simplemente enumerar pero no crear Z y almacenar el resultado en él.
function Z = pair2(k)
count = [2*k-1:-2:3];
tcount = prod(count);
Z = zeros(tcount,2*k);
x = [ones(1,k-2) 0];
z = zeros(1,2*k);
for i=1:tcount
for j=k-1:-1:1
if x(j)<count(j)
x(j) = x(j)+1;
break
end
x(j) = 1;
end
y = [1:2*k];
for j=1:k-1
z(2*j-1) = y(1);
z(2*j) = y(x(j)+1);
y([1 x(j)+1]) = [];
end
z(2*k-1:2*k) = y;
Z(i,:) = z;
end