0 と 1 の行列があります。値が 1 の各セルは、空でないセルを表します。1 を持つセルは、座標を持つベクトルに保持されます。リストを繰り返し処理し、各要素を隣接する空いているセルの 1 つにランダムに移動します。
ベクトル演算でこれを行う方法はありますか?
ありがとう
0 と 1 の行列があります。値が 1 の各セルは、空でないセルを表します。1 を持つセルは、座標を持つベクトルに保持されます。リストを繰り返し処理し、各要素を隣接する空いているセルの 1 つにランダムに移動します。
ベクトル演算でこれを行う方法はありますか?
ありがとう
これが最もエレガントで効率的な試みではありませんが、それでも機能するはずです。
まず、空でないセルのx、y座標があると仮定します。
c=[x y];
2D配列内の8つの最近傍(nn)の相対位置は、次の式で与えられます。
nn=[1 1;1 -1;-1 1;0 -1;-1 0;0 1;1 0;-1 -1];
c
そのnnの周りの各x、y座標のすべての可能な順列を取りましょう
permc=bsxfun(@plus,repmat(c,[1 8]),nn(:)');
次に、各x、y座標の8つのオプションからランダムnnのベクトルを設定します。
ri=randi(8,numel(x), 1);
ランダムな新しい座標を選択するためにそれを使用します
new_c= [ permc(sub2ind(size(permc), (1:numel(x))', 2*ri-1 )) , ...
permc(sub2ind(size(permc), (1:numel(x))', 2*ri))];
問題:
コードは、無料ではないnnがあるかどうかをチェックせず、手元 にある情報c
を持っていることを解決するのは難しくありません。permc
コードは、ポイントが配列の端にあることを気にしないため、0または配列のサイズより1大きい座標を選択できます。繰り返しにpermc
なりますが、このケースに取り組むための情報があり、いくつかの方法で別々に扱うことができます。
それが要点です。
おそらくですが、書くのはかなり難しいと思います。2 つの「ドット」が同じ空の場所に同時に移動しないように注意する必要があります。
ベクトルをループして、一度に 1 つのドットを処理する方がはるかに簡単に思えます。ベクトル演算でこれを行いたい理由は何ですか? コードの高速化を検討している場合は、コードを投稿して提案を求めてください。