4

NxM 次元の行列があるとします。たとえば、4x4 マトリックス:

0  1  2  3
4  5  6  7
8  9  10 11
12 13 14 15

各セルには、隣接する 8 つのセルがあります。たとえば、セル 5 の隣接セルは、0、1、2、4、6、8、9、10 です。

0 1 2
4 5 6
8 9 10

ただし、隣接するセルはマトリックスをラップすることによっても見つけることができるため、セル 7 の隣接するセルは 2,3,0,5,4,10,11,8 です。

2  3 | 0
6  7 | 4
10 11| 8

上下も同様に巻くことができます。

無作為にポイント (p) を選択した場合、隣接する 8 つのセルすべての値を見つける簡単な方法はありますか? ここまでで、m が行列の幅 (この場合は 4) であるこのリストを思いつきました。

adjacentcells = [p+1, p-1, p+m, p-m, p+m-1, p+m+1, p-m-1, p-m+1]
for value in adjacentcells:
    if value < 0:
        value = value + len(matrix)
    if value >= len(matrix)
        value = value % len(matrix)
    adjacentlist.append(value)

ただし、隅にあるセルを選択すると、隣接する 7 つの正しい値と、誤ったセルが 1 つ返されます。誰かが私が間違っているところを指摘できますか?

*複雑な (ばかげた) 理由から、行列を文字列として格納しているため、len(matrix) を実行して 16 を取得できます。

4

1 に答える 1

2

計算されたインデックスだけでなく、両方の軸でモジュロ演算を個別に使用する必要があります。

このヘルパー関数を使用してみてください:

def addr(x,y,m,n):
  """
  Given an MxN matrix stored in a 1-d sequence,
  return the index of (possibly wrapped) X,Y
  """
  return (y%n)*m+(x%m)

これで、隣接するセルを計算できます。

def getAdjacentCells(x,y):
  adjacentlist = []
  for dx in (-1, 0, +1):
    for dy in (-1, 0, +1):
      if(dx != 0 or dy != 0):
        adjacentlist.append(addr(x+dx, y+dy, 4, 4))
  return adjacentlist

そして、それが機能することを証明できます:

# 5
assert sorted(getAdjacentCells(1,1)) == [0,1,2,4,6,8,9,10]
# 7
assert sorted(getAdjacentCells(3,1)) == [0, 2, 3, 4, 6, 8, 10, 11]
# 15
assert sorted(getAdjacentCells(3,3)) == [0, 2, 3, 8, 10, 11, 12, 14]
于 2013-03-06T02:37:48.690 に答える