我遇到一个问题,我在一个100x100的零网格上有4个对象(1s),它被分成16个25x25的偶数正方形。 我需要创建一个(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);
问题是如何在表格中生成和存储这种排列作为线性索引。
答案 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).';