2012-02-29 8 views
1

によるマトリックスをソートし、ランダム化は、以下のようにIは、32×3行列を有する特定の制約

112;

113;

114;

115;

116;

117;

118;

1 2 1;

1 2 2;

1 2 3;

1 2 4;

1 2 5;

1 2 6;

1 2 7;

1 2 8;

2111;

2 1 2;

2 1 3;

2 1 4;

2 1 5;

2 1 6;

2 1 7;

2 1 8;

2 2 1;

2 2 2;

2 2 3;

2 2 4;

2 2 5;

2 2 6;

2 2 7;私がする必要がある何

2 2 8]

一緒に行の値を維持しながら、しかし、これは(:、4)のためになるように制約される必要があり、行の順序をランダム化毎であります8行には、1〜8の数字だけが含まれます。

A(1::だからたとえば、次のような何かを持っている可能性があり8、:) =

[1 2 4。

115;

2 1 6;

118;

2 2 1;

2 1 2;

2 1 7;

1 1 3]

第2列の1及び2の発生がランダムであることが必要で、1 - 8ニーズが第3列のすべての8つの値のために無作為化されます。当初、関数randswapをループ内で制約を追加して使用しようとしましたが、これによってループが無限になりました。最初の2つの列の1と2が同じ列の最後の列と同じ回数表示される必要があるので、行が一緒になっていることも重要です。あなたが必要とするすべては、Aのうち、8行の1セットを取得する場合、あなたはこのような結果を構築することができ

m = size(A,1); 

    n = 1:8; 

    out = 1; 

    i2 = 1; 

    while ~all(ismember(1:8,out)) && i2 < 100 

    i1 = randperm(m); 

    out = A(i1(n),:); 

    i2 = i2 + 1; 

    end 

答えて

1

...誰かが次のことを示唆したが、それは非常にうまくいかない:

out = [randi([1,2],[8,2]),randperm(8)'] 

out = 
    2  1  5 
    2  1  2 
    2  1  1 
    1  2  7 
    2  2  6 
    1  1  8 
    2  2  3 
    1  1  4 
あなたが Aの全てをランダム化する必要がある場合は

は、次の操作を行うことができます:あなたがunique(out,'rows')を行う場合は、32一意の行が実際に存在していることがわかります

%# calculate index for the 1's and 2's 
r = rand(8,4); 
[~,idx12] = sort(r,2); 

%# calculate index for the 1's through 8's 
[~,idx8] = sort(r,1); 

%# use idx8 to shuffle idx12 
idx8into12 = bsxfun(@plus,idx8,[0 8 16 24]); 

%# now we can construct the output matrix 
B = [1 1;1 2;2 1;2 2]; 
out = [B(idx12(idx8into12),:),idx8(:)]; 

out = 
    1  1  7 
    1  2  3 
    1  2  1 
    2  1  8 
    2  1  5 
    2  2  4 
    2  2  2 
    2  1  6 
    1  1  3 
    1  2  7 
    1  1  1 
    1  2  8 
    1  2  4 
    1  1  5 
    2  2  6 
    2  1  2 
    1  1  8 
    2  1  7 
    1  2  5 
    2  1  1 
    1  2  6 
    2  1  3 
    1  1  2 
    1  1  4 
    2  1  4 
    2  2  7 
    2  2  8 
    2  2  3 
    1  2  2 
    1  1  6 
    2  2  5 
    2  2  1 

outの8行ごとに、3番目の列に1から8の番号が付けられています。

+0

ありがとうございました!これは問題を完全に解決します。 – Lau

関連する問題