假设您正在尝试以棋盘格式访问数组:
0 1 2 3 4 5 6 7 0 o • o • o • o • 1 • o • o • o • o 2 o • o • o • o • 3 • o • o • o • o 4 o • o • o • o • 5 • o • o • o • o 6 o • o • o • o • 7 • o • o • o • o
所以,假设你在这里访问黑色元素,并添加所有4个白色邻居。
你不能在边缘或角落处这样做,因为那里分别只有3个和2个白色邻居。因此,您最终会在边缘添加所有3个白色,并且 0 用于越界访问。
执行此操作的低效方法是执行类似
的操作at each element
if element to the right is not out of bounds ...
但我不想做这样的检查。
所以我所做的就是将循环切成条状,所以:
at each element ON LEFT EDGE
add 3 elements i know are in bounds (right, up, down)
然后是角落的特殊情况
at top left corner..
add 2 elements i know are in bounds (right, down)
所以这最终得到了一个非常长的代码,但没有约束检查。我正在寻找一种方法来减少代码块的长度,并使其更易于维护。
任何技巧?
答案 0 :(得分:2)
一种可能的解决方案是填充数据。也就是说,添加一些具有中性值的边界。我已经用x
- es说明了这一点。
0 1 2 3 4 5 6 7 x x x x x x x x x x 0 x o • o • o • o • x 1 x • o • o • o • o x 2 x o • o • o • o • x 3 x • o • o • o • o x 4 x o • o • o • o • x 5 x • o • o • o • o x 6 x o • o • o • o • x 7 x • o • o • o • o x x x x x x x x x x x
边界的实际“厚度”显然取决于你寻找每个元素的距离(你的窗口/内核宽度/高度)。在查看直接邻居的情况下,只需要一个大小为1的边界。
是的,这确实意味着您将处理更多的数据。但优点是,虽然您不得不考虑寻址,但角落/边界情况不再需要进行任何特殊检查。