问题描述
假设我有一个长度为 2k
的列表,比如说 {1,2,...,2k}
。将 2k
数字分组为 k
(无序)对的可能方式的数量是 n(k) = 1*3* ... *(2k-1)
。所以对于k=2
,我们有以下三种不同的形成2对的方式
(1 2)(3 4)
(1 3)(2 4)
(1 4)(2 3)
如何使用 Matlab 创建上述列表,即创建一个 n(k)*(2k)
矩阵,使得每一行都包含将 2k
数字列表分组为 k
的不同方式对。
解决方法
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
因为有人认为我以前的回答没有用,所以我发布了这个。
,我有以下蛮力枚举对的方法。不是特别有效。当 k>9 时也会导致内存问题。在这种情况下,我只能枚举但不能创建 Z 并将结果存储在其中。
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
,
k = 3;
set = 1: 2*k;
combos = combntns(set,k);
[len,~] = size(combos);
pairs = [combos(1:len/2,:) flip(combos(len/2+1:end,:))];
pairs =
1 2 3 4 5 6
1 2 4 3 5 6
1 2 5 3 4 6
1 2 6 3 4 5
1 3 4 2 5 6
1 3 5 2 4 6
1 3 6 2 4 5
1 4 5 2 3 6
1 4 6 2 3 5
1 5 6 2 3 4
查看更多