Rcpp
(C++
はR
)の行列をメモリ内の列の順番で格納しています。すなわち、それは次のようになります。ベクトルのインデックスを使用してムーア近傍を取得する方法
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
、私はi = 1
から25
に走る単一for
ループを持っている(心の中でクマを、それがベースのすべてゼロであるが、ここで私は、便宜上1を言っています)。
マトリックスのすべての要素について、私はそのムーア近隣を望みます。これは、エッジにない要素では簡単です。私たちの選択したインデックスがidx
で、正方行列のサイズがnrow
であれば、我々は
leftmid = idx - nrow
lefttop = (idx - nrow) - 1
leftbot = (idx - nrow) + 1
rightmid = idx + nrow
righttop = (idx + nrow) - 1
rightbot = (idx + nrow) + 1
midtop = idx - 1
midbot = idx + 1
を持っているが、私はエッジケースに対処する方法を見つけ出す傾けます。例えば、idx = 3
場合、それから私は隣人をしたい:
leftmid = 23
lefttop = 22
leftbot = 24
rightmid = 8
righttop = 7
rightbot = 9
midtop = 2
midbot = 4
それは同様にもう少し複雑なコーナーケースのです。ここの目標は時間を短縮することです。現在私のプログラムはdouble forループで動作していますが、それは妥当なものより遅いです。私はパフォーマンスを改善するためにそれを単一のfor
ループに変更したいと思います。
編集:left
とright
の境界がモジュラスによって得られることを実現しました。従って3 - 5 %% 25 = 23
。しかし、私はまだ上端と下端のケースを持っています。