私のアプローチは次のとおりです。
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
毎回 1 つの乱数を生成しても、それほど遅くはなりません。それが本当にボトルネックである場合、それを高速化する方法も間違いなくあります。うまくいけば、この例があなたをもう少し先に進めることができます.