2016-08-16 12 views
0

に5組に行列をパーティションIはMatlabの

sV:=[0 -1; 
    1 1; 
    1 0; 
    2 1; 
    2 0; 
    3 1; 
    3 0] 

がマトリックスsVは、その要素上記1x2行ベクトルである集合を表していることを想像してマトリックスを有しています。

sVを5つの空でないセット(140からhere)に分割する方法はいくつかあります。

例えば5分割sVの方法がある:

{(0,-1)} 
{(1,1)} 
{(1,0)} 
{(2,1)} 
{(2,0), (3,2), (3,0)} 

分割セットの可能カーディナリティは(順序を考慮せず)1,1,1,1,3又は1,1,1,2,2あります。

QUESTION:

はあなたが

V_all{1,1}は、パーティショニングセットは持っているsVように5-分割セットのすべての可能な方法をリストmx5細胞であることをV_all1x2セルを構築するために私を助けてもらえカーディナリティー1,1,1,1,3。具体的には、任意のJ = 1、...、M、V_all{1,1}{j,1}1x2ベクターであるべきで、V_all{1,1}{j,2}1x2ベクターであるべきで、V_all{1,1}{j,3}1x2ベクターであるべきで、V_all{1,1}{j,4}1x2ベクターであるべきで、V_all{1,1}{j,5}3x2ベクターであるべきです。

V_all{1,2}は、パーティショニング・セットが、それぞれ、カーディナリティ1,1,1,2,2を有するsVようにセットし、5分割のすべての可能な方法を列挙nx5細胞です。具体的には、任意のJ = 1、...、N、V_all{1,1}{j,1}1x2ベクターであるべきで、V_all{1,1}{j,2}1x2ベクターであるべきで、V_all{1,1}{j,3}1x2ベクターであるべきで、V_all{1,1}{j,4}2x2ベクターであるべきで、V_all{1,1}{j,5}2x2ベクターであるべきです。

m+n=140に注意してください。


ここで私の試み。 140以上のパーティションがあるため、エラーが発生する可能性があります。

%3+1+1+1+1 
k=3; 
M=reshape(sV(nchoosek(1:size(sV,1),k),:),[],k,size(sV,2)); 
V_1=cell(size(M,1),2); 
for p=1:size(M,1) 
    V_1{p,1}=squeeze(M(p,:,:)); 
    left=~ismember(sV, V_1{p,1}, 'rows'); 
    V_1{p,2}=sV(left,:); 
end 
%Rearrange 
for j=1:size(V_1,1) 
    V_1new{j,1}=V_1{j,1}; 
    V_1new{j,2}=V_1{j,2}(1,:); 
    V_1new{j,3}=V_1{j,2}(2,:); 
    V_1new{j,4}=V_1{j,2}(3,:); 
    V_1new{j,5}=V_1{j,2}(4,:); 
end 
V_all{1,1}=V_1new; 

%2+2+1+1+1 
k=4; 
M=reshape(sV(nchoosek(1:size(sV,1),k),:),[],k,size(sV,2)); 
V_2=cell(size(M,1),2); 
for p=1:size(M,1) 
    V_2{p,1}=squeeze(M(p,:,:)); 
    left=~ismember(sV, V_2{p,1}, 'rows'); 
    V_2{p,2}=sV(left,:); 
end 

k=2; 
count=0; 
for j=1:size(V_2,1) 
    M=reshape(V_2{j,1}(nchoosek(1:size(V_2{j,1},1),k),:),[],k,size(V_2{j,1},2)); 
    V_2_22=cell(size(M,1),2); 
    for p=1:size(M,1) 
     V_2_22{p,1}=squeeze(M(p,:,:)); 
     left=~ismember(V_2{j,1}, V_2_22{p,1}, 'rows'); 
     V_2_22{p,2}=V_2{j,1}(left,:); 
    end 
    for l=1:size(V_2_22,1) 
     V_2new{count+l,1}=V_2_22{l,1}; 
     V_2new{count+l,2}=V_2_22{l,2}; 
     V_2new{count+l,3}=V_2{j,2}(1,:); 
     V_2new{count+l,4}=V_2{j,2}(2,:); 
     V_2new{count+l,5}=V_2{j,2}(3,:); 
    end 
    count=size(V_2new,1); 
end 

V_all{1,2}=V_2new; 
+0

十分。あなたは*何でも試しましたか? – thewaywewalk

+0

2つのパーティショニングセットが必要な場合は、このコードがあります。 2つのパーティショニングセットにそれぞれカーディナリティ3,4が必要であるとします。すべての可能なパーティションを作成するためのコードは.... – user3285148

+0

k = 3;M = reshape(sV(n:1)size(sV、1)、k)、:)、[]、k、size(sV、2)); V_34 =セル(サイズ(M、1)、2); (M、1) V_34 {p、1} =スクイーズ(M(p、:、:) :); left =〜ismember(sV、V_34 {p、1}、 'rows'); V_34 {p、2} = sV(left、:); end – user3285148

答えて

0

冪の要素がある場合、我々はセットがこのようにpartitonedする[2 3]例えば冪 を使用することができるパーティションの位置を見つけるために:

0 -1; 
1 1; 
----- <-- 2 
1 0; 
----- <-- 3 
2 1; 
2 0; 
3 1; 
3 0] 

我々が得ることができますこの場合、各パーティションの要素数(num_el):[2,1,4] これはカーディナリティですが、カーディナリティの要素の順序はインポートではないため、[2,1,4]は[1 4 2]私たちはそれを得ることができる[1 2 4]

では、カーディナリティをパーティションのセットにマップするための連想コンテナ(ディクショナリ)が必要です。我々は文字列に数値の基数のフォームの配列の表現を変更する必要があるので、MATLABで

連想コンテナはとても構造体のキーとして使用することができます構造体で実現することができるし、我々が得る:「_1_2_4」

V_allです構造アレイとして実装連想コンテナ:

V_all( '_ 1_2_4')= {{} ....}

sV=[0 -1; 
    1 1; 
    1 0; 
    2 1; 
    2 0; 
    3 1; 
    3 0] 

n = size(sV,1) 
p=powerset(1:(n-1)); 

cardinality =sprintf('_%i',n); 
V_all.(cardinality)(end+1)={sV}; 
for i = 2:numel(p) 
    num_el = [p{i} n] - [0 p{i}]; 
    cardinality = sprintf('_%i',sort(num_el)); 
    cum = [0 cumsum(num_el)]; 
    temp = {}; 
    for j = 2: numel(cum) 
     temp(end + 1) = {sV(cum(j-1)+1:cum(j),:)}; 
    end 
    V_all.(cardinality)(end+1)={temp}; 
end