Matlab: Comment énumérer les manières possibles de former des paires à partir d'une liste
Supposons que j'ai une liste de longueur 2k
, disons {1,2,...,2k}
. Le nombre de façons possibles de regrouper les 2k
nombres en k
paires (non ordonnées) est de n(k) = 1*3* ... *(2k-1)
. Donc pour k=2
, nous avons les trois façons différentes suivantes de former 2 paires
(1 2)(3 4)
(1 3)(2 4)
(1 4)(2 3)
Comment puis-je utiliser Matlab pour créer la liste ci-dessus, c'est-à-dire créer une matrice de n(k)*(2k)
telle sorte que chaque ligne contienne une manière différente de regrouper la liste de 2k
nombres en k
paires.
Réponses
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
Comme quelqu'un pense que ma réponse précédente n'est pas utile, je poste ceci.
J'ai la façon suivante d'énumérer les paires par force brute. Pas particulièrement efficace. Cela peut également causer des problèmes de mémoire lorsque k> 9. Dans ce cas, je peux simplement énumérer mais pas créer Z et y stocker le résultat.
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