在Matlab中以特定方式将k - 组合拆分为2

时间:2014-04-07 09:06:23

标签: matlab

考虑一个集合,

 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时产生错误。 任何使这项工作有效的想法。

1 个答案:

答案 0 :(得分:0)

我想我可以概述如何实现这一目标。

  • 获取子集(对于A)使用setdiff

    s = 1:7 b = 4 tmp = setdiff(s,b)

  • 用于排列使用randperm

    t2 = randperm(length(tmp)) A = tmp(t2)

  • 对于特定子集,只需选择A

  • 的前n个条目

将整个事物放在一些循环中以创建您描述的集合。