我的方法如下:
1) Generate a single random number (uniform distribution)
on the interval `[1 numel(A)]`. Use this as the linear index
of a seed for your clump.
while clump_size < desired_clump_size
2) Generate a list of all positions in the matrix adjacent to
(but not already included in) the existing clump.
3) Randomly select one of these indices
4) Grow the clump by placing an element in this position.
end
我不打算写代码;实现起来应该不难,特别是如果这段代码不是整个项目的性能瓶颈。
编辑:既然你自己试了一下,这里有一些代码:
desired_clump = 5;
matrix_size = 5;
A = zeros(matrix_size);
[C,R]=meshgrid(1:size(A,1), (1:size(A,2))'); %'# row and column numbers for each element
seed = ceil(rand(1)*numel(A));
#% I would have used randi(1) but octave online utility doesn't have it
A(seed) = 1; #% initialize a clump
clump_size = 1;
while clump_size < desired_clump
CI = A==1; #% logical index of current clump
CR = reshape(R(CI),1,1,[]); #% 1x1xN index of row values of current clump
CC = reshape(C(CI),1,1,[]); #% 1x1xN index of col values of current clump
ADJ = sum(bsxfun(@(x,y)abs(x-y),R,CR)<=1 & bsxfun(@(x,y)abs(x-y),C,CC)<=1, 3)>0 & ~A;
#% ADJ is the indices of the elements adjacent to the current clump
B=A; #% for display purposes only
B(ADJ)=2;
disp(B)
disp(' ')
POS = find(ADJ); #% linear indices of the adjacent elements
IND = ceil(rand(1)*numel(POS)); #% random index into POS vector
A(POS(IND))=1; #% grow the clump
clump_size = clump_size+1;
end
disp(A);
输出:
1
表示丛中的元素;2
意味着有资格进行丛集扩展
iteration 1:
0 0 2 1 2
0 0 2 2 2
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
iteration 2:
0 0 2 1 2
0 0 2 1 2
0 0 2 2 2
0 0 0 0 0
0 0 0 0 0
iteration 3:
0 0 2 1 2
0 0 2 1 2
0 0 2 1 2
0 0 2 2 2
0 0 0 0 0
iteration 4:
0 0 2 1 1
0 0 2 1 2
0 0 2 1 2
0 0 2 2 2
0 0 0 0 0
Final clump:
0 0 0 1 1
0 0 1 1 0
0 0 0 1 0
0 0 0 0 0
0 0 0 0 0
每次生成一个随机数不应该那么慢。如果它确实是一个瓶颈,毫无疑问还有一些方法可以加速它。希望这个例子能让你更进一步。