我确实有以下问题要解决:我有一个简单但很大的网格图(大小:mX-times-mY)。我只区分被障碍占用的瓷砖或是自由的。
现在假设我使用大小为n-times-n的相对较小的滑动窗口,因此n<< mX,n<我的。对于n次n窗口中所有可能的占用和自由瓦片组合,我分配一个标识符(我们只说一个数字)。然后我拍摄了一张大窗口大小的“快照”。
我的问题:确定从地图中提取的当前模式的标识号的最简单和/或最快的方法是什么?
要演示:我有一个2x2窗口(所以2x2矩阵)。有2 ^(2x2)= 16种可能的模式组合。
Pattern #1 #2 #3 #4 #5 #6 #7 #8
00 #0 0# 00 00 ## #0 00
00 00 00 #0 0# 00 #0 ##
Pattern #9 #10 #11 #12 #13 #14 #15 #16
0# #0 0# 0# #0 ## ## ##
0# 0# #0 ## ## 0# #0 ##
with # = obscured
0 = free
假设我提取模式
#0
0#
从我的地图中,我怎样才能轻松快速地确定这是上面示例中的模式编号10?
到目前为止我的想法:
循环遍历所有模式,直到找到正确的模式,可能通过检查两种模式的差异是否为零矩阵。
我将所有n行和所有n列相加,并将这些和作为多维数组中的子指数使用。 对于上面的例子:sumRow1 = 1 sumRow2 = 1 sumCol1 = 1 sumCol2 = 1 所以我的模式保存在patternNumbers [1] [1] [1] [1] = 10中。另一个例子是模式16,它将保存在patternNumbers [2] [2] [2] [2] = 16。
更大窗户的可能优势:我只需要计算2 * n总和,并立即使用这些总和来解决我正在寻找的模式。 大的,大的缺点:我需要一个(2 * n)维数组,其中将留下许多空的托盘。所以开销相对较大。
你们之前有没有人这样做过?任何想法如何解决这个问题?我也没有考虑任何形式的对称性(旋转或线)。
非常感谢任何帮助!
答案 0 :(得分:0)
好吧,看起来我找到了一个相对简单的解决方案,其他人向我指出:
通过按特定顺序获取所有行或所有列(无关紧要,您的选择!) - 对于所有模式必须相同 - 并将它们对齐为一个长向量,然后获得常规二进制表达式。只需将该二进制数转换为十进制数,即可拥有“唯一标识符”。
Example 1:
00
#0
can also be written as
00
10
now reorder the rows to
0010 = 2
=============================
Example 2:
##
00
can also be written as
11
00
now reorder the rows to
1100 = 12