Matlab : 목록에서 쌍을 형성하는 가능한 방법을 열거하는 방법
Jan 20 2021
나는 길이의 목록이 있다고 가정하자 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
쌍 으로 그룹화하는 다른 방법이 포함되도록 행렬을 만들 수 있습니다 .
답변
LucienXhh Jan 20 2021 at 15:37
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
누군가 내 이전 답변이 유용하지 않다고 생각하므로 이것을 게시합니다.
RaymondKan Jan 20 2021 at 17:35
쌍을 열거하는 다음과 같은 무차별 대입 방법이 있습니다. 특히 효율적이지 않습니다. 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