MATLAB - 网格特定区域中随机索引的排列

时间:2016-12-06 19:05:34

标签: algorithm matlab permutation

我遇到一个问题,我在一个100x100的零网格上有4个对象(1s),它被分成16个25x25的偶数正方形。 enter image description here 我需要创建一个(16 ^ 4 * 4)表,其中的条目列出了16个子矩阵中这4个对象中每个对象的所有可能位置。对象可以是子矩阵内的任何位置,只要它们不相互重叠即可。这显然是一个排列问题,但由于索引以及位置在第16平方内是随机但不重叠的事实,增加了复杂性。会喜欢任何指针!

我尝试做的是创建一个名为“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);

问题是如何在表格中生成和存储这种排列作为线性索引。

1 个答案:

答案 0 :(得分:0)

首先使用以ndgrid矩阵[4 , 16^4]形式生成的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).';