2016-12-06 13 views
1

私は25x25の16偶数の四角形に分割された0の100x100グリッドに4つのオブジェクト(1s)があるという問題があります。 enter image description here 16個のサブマトリックスにわたってこれらの4つのオブジェクトのそれぞれの可能な位置をすべて列挙した(16^4 * 4)テーブルを作成する必要があります。対象物は、互いに重なり合わない限り、サブマトリックス内のどこにあってもよい。これは明らかに置換問題であるが、索引付けのために複雑さが増し、位置はランダムであるが、16番目の四角内で重複しないという事実がある。任意のポインタを愛するだろう!MATLAB - グリッドの特定の領域のランダムなインデックスの置換

私がしようとしたのは、あなたがいるサブマトリクスの左上隅の添え字を返す "top_left_corner(position)"という関数を作成することでした。 top_left_corner(1)=(1,1)、top_left_corner(2)=(26,1)、等そして、私が持っている:

 pos = randsample(24,2); 
     I = pos(1)+top_left_corner(position,1); 
     J = pos(2)+top_left_corner(position,2); 

問題は表にこの順列を生成して格納する方法であります線形インデックス。

答えて

0

行列permの形式で生成されたデカルト積を最初に使用します。その後、whileループで乱数が生成され、permに追加されます。 permのいずれかのカラムに重複した乱数が含まれていると、カラムに要素が重複しなくなるまで乱数の生成が繰り返されます。通常は2-3回の反復しか必要ありません。 [100,100]配列は、16ブロックに分割されているので、kronを使用して16個のブロックのようなインデックスパターンが生成され、ソートされた要素の機能インデックスがsortで抽出されます。生成された乱数は、パターンのインデックス(16ブロック)を形成する。

C = cell(1,4); 
[C{:}]=ndgrid(0:15,0:15,0:15,0:15); 
perm = reshape([C{:}],16^4,4).'; 

perm_rnd = zeros(size(perm)); 
c = 1:size(perm,2); 
while true 
    perm_rnd(:,c) = perm(:,c) * 625 +randi(625,4,numel(c)); 
    [~ ,c0] = find(diff(sort(perm_rnd(:,c),1),1,1)==0); 
    if isempty(c0) 
     break; 
    end 
    %c = c(unique(c0)); 
    c = c([true ; diff(c0)~=0]); 
end 
pattern = kron(reshape(1:16,4,4),ones(25)); 

[~,idx] = sort(pattern(:)); 
result = idx(perm_rnd).'; 
+0

ワウ!ありがとう、それは絶対に素晴らしいです。本当にそれを感謝:) –

+0

私は最終的に私は必要な順列をかなり得ていなかったので、 'perm_rnd'を生成するために少し違ったことを追加するかもしれません。 'range = 0:15; 組み合わせ= permn(範囲、4); perms =転置(組み合わせ)。 perm_rnd = 0(サイズ(パーマ)); ' [ここ](https://www.mathworks.com/matlabcentral/fileexchange/7147-permn-v--n--k-) –

+0

にあるパーマン関数を使用していたのは違いはありません。両方ともnumel(0:15)> 4の間にデカルト積を生成する – rahnema1

関連する問題