0

id 値を持つ 2-D マトリックスから、ボード上の各要素の隣接する id を抽出しようとしています。

ID とその座標 (n 要素) のリストがあり、次を作成しています: (左隣のみの例)。

%Left:
leftIndex = (currentLocationIndex - bSize);
hasLeft = leftIndex >= 1; %If element on first col, value will be 0 or negative
hasLeft = hasLeft(:) & board(leftIndex)==0;

私は得ます:添え字のインデックスは、実数の正の整数または論理値のいずれかでなければなりません。

&& オペランドのプリンシパルまたはその他のロジックを使用したい。leftIndex には、テーブル内の現在のインデックスまで残っているすべてのインデックスが含まれます。合法的なものもあれば、そうでないものもあります。hasLeft ベクトルが true の場合、leftIndex ベクトル値は「ボード」で有効です。

hasLeft が true の場合にのみ、ベクトルの特定の値で隣人をチェックするにはどうすればよいですか?

ありがとう!

4

3 に答える 3

2

私は2つのことをします:

まず、「違法な」ものを含む「すべての隣人」を見つけます。たとえば、インデックスが である場合、n, mすべての「潜在的な近隣」は[pn pm]= meshgrid(n+(-1:1), m+(-1:1));です。これにはポイント自体も含まれることに注意してください。

次に、配列の制限に対して値をテストすることにより、「正当な」近隣のみをマスクします。サイズが N x M の 2D 配列がある場合は、次を使用できます。

legal = find(pn>0 && pn <= N && pm > 0 && pm <= M && ~(pn==n && pm==m));

これにより、(最大 8 つまで) すべての合法的な隣人が得られます。明らかに、「キティ コーナー」の隣人が必要ない場合は、作成したステートメントとを変更しpnますpm。理解していただければ幸いです。

于 2013-02-26T22:52:52.267 に答える
1

あなたの質問をもっと注意深く読んで、あなたが求めたものだけに答えてください (あなたの他の最近の質問を読んだ後、より明確になりました...):

最初に遭遇する問題は、配列leftIndexに 1 未満の値が含まれている可能性があるため、式で合法的に使用できないという事実です。hasLeft = hasLeft(:) & board(leftIndex)==0;

これを回避するにboardは、前の行を次のように変更することで取得できる「有効な」インデックスのみでインデックスを作成する必要があります。

hasLeft = find(leftIndex >= 1);

hasLeft = leftIndex >= 0;元の は、 と同じサイズの「true」および「false」値の論理配列を生成することに注意してくださいleftIndex。対照的に、findコマンドは基準を満たす要素のインデックスのみを返します。ここで、さらに 2 つのことを行う必要があります。1)board有効なインデックスと値 >=0 を持つ要素を検索します。2) これらを「全体」のインデックス (サブ配列のインデックスではない) にマップし直します。方法は次のとおりです。

interestingSquare = (board(hasLeft)==0);
hasLeft = hasLeft(interestingSquare);

この最後の行は、「サブ配列 'hasLeft' 内の興味深い正方形の位置」から「元のleftIndex配列に対する相対位置」に戻ります。

あなたは本当にテストするつもりだったのだろうかと思いますboard == 0が、それがタイプミスだった場合、あなたはそれを理解するでしょう...

于 2013-02-27T22:23:10.000 に答える