2014-04-07 19 views
0

考虑一组,分割的k - 组合成2以特定的方式在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。 任何想法,使这项工作和高效。

+0

此外,可能推广这一切的所有可能的s(1 enigmae

+0

你的问题有点混乱。首先你要求*全部* - 但是你只需要“在分隔符之前的集合”是唯一的。最后,举个例子,分隔符后面的数字*是唯一的。 – bdecaf

+0

如果令人困惑,我很抱歉。看看这是否更清楚。我希望所有可能的数组规定了我用例子解释的条件。 分隔符后的数字是自动唯一的,如果您将分隔符之前出现的组设置为唯一的。 – enigmae

回答

0

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

  • 得到子集(图A)使用setdiff

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

  • 用于置换使用randperm

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

  • 的特定子集只挑头n条目的A

把整个事情放在一些循环中来创建你描述的集合。

+0

什么可以让这个简单得到所有允许的排列与'nchoosek'? – patrik

+0

我对此也很好奇 - 但似乎问题不在于获取*所有*排列,而是相对较小的子集。无论如何,我只是建议一些细节仍然不清楚。 – bdecaf

+0

我添加了使用'setdiff'的代码。检查编辑。 – enigmae