考虑一个集合,
S = {1,2,3,4,5,6,7}
我试图想出一个函数,它将S作为输入并给我所有可能的数组:
[ 1 ~ 2 ; 1 ~ 3 ; 1 ~ 4 ; 1 ~ 5 ; . . . ; 6 ~ 7 ]
[ 1 2 ~ 3 ; 1 2 ~ 4 ; ...; 2 3 ~ 1 ; 2 3 ~ 4....; 5 6 ~ 7]
.
.
.
[ 2 3 4 5 6 7 ~ 1 ; 1 3 4 5 6 7 ~ 2 ; ... ; 1 2 3 4 5 6 ~ 7 ]
这里注意'〜'有点像放在k - 组合元素之间的分隔符,这样在分隔符之前出现的集合在每个数组中总是唯一的。
例如,我们想要两种7种组合
[ 2 3 4 5 6 7 ~ 1 ] and [ 1 2 3 4 5 6 ~ 7 ].
但我们只想要一个
[ 1 2 3 4 5 6 ~ 7 ] and [ 1 3 4 5 6 2 ~ 7 ].
我的代码:
clear all
for k = 1:7
Set = nchoosek(1:7,k);
for i = 1:length(Set)
A = setdiff(1:7,Set(i,:));
P = nchoosek( A , 2 ); % trialing it for only A~B where B has only 2elements
L = length( P );
S = repmat( Set ( i,: ) , L,1);
for j = 1:L
S1(j,:) = setdiff( S(j,:) , P(j,:) );
W(j,:) = [ S1(j,:) , 0 , P(j,:) ];
end
W1(i,k) = {W};
end
end
然而,这在k = 2时产生错误。 任何使这项工作有效的想法。
答案 0 :(得分:0)
我想我可以概述如何实现这一目标。
获取子集(对于A)使用setdiff
s = 1:7
b = 4
tmp = setdiff(s,b)
用于排列使用randperm
t2 = randperm(length(tmp))
A = tmp(t2)
对于特定子集,只需选择A
将整个事物放在一些循环中以创建您描述的集合。