我在Matlab中给出了一个二进制矩阵,我有兴趣在这个二进制矩阵中找到网格结构。
例如,考虑这个“棋盘”二进制矩阵:
X = zeros(11,20);
indeces = 1:2:220;
X(indeces) = 1;
imshow(X);
在这种情况下,结果将是由
给出的两个子网格x = 1:1:20;
y = 1:1:11;
[X,Y] = meshgrid(x,y);
% First subgrid
X1 = ( mod(X - 1,2) == 0 & mod(Y - 1,2) == 0);
imshow(X1)
% Second subgrid
X2 = (mod(X,2) == 0 & mod(Y,2) == 0);
imshow(X2)
当然,这是一个简单的例子,通常X
会不那么规律。我可以为网格提供最大步长。
编辑:为了使其精确:网格G 是由以下参数定义的二进制矩阵 - 总大小size(G)
,左上角[x0,y0]
,a网格点之间的间距s
和水平和垂直方向上的点数numX, numY
。这是从这些参数构造网格的一种可能性:
function G = createGrid(totalSize,upperLeft,stepSize,numX,numY)
x = 1:totalSize(2);
y = 1:totalSize(1);
[X,Y] = meshgrid(x,y);
G = (mod(X - upperLeft(1),stepSize) == 0 & ...
mod(Y - upperLeft(2),stepSize) == 0 & ...
(X - upperLeft(1) + 1 > 0) & ...
(X < upperLeft(1) + stepSize * (numX - 1) + 1) & ...
(Y - upperLeft(2) + 1 > 0) & ...
(Y < upperLeft(2) + stepSize * (numY - 1) + 1));
二进制矩阵G
的子网格 M
是一个sum(~(M(G)==1)) = 0
的网格。请注意,特别是网格可以是其他网格的子网格。
如果符合以下条件,则二进制矩阵G
的子网格M
称为最大:如果G
是另一个网格{{1}的子网格}与G2
不同,则G
不是G2
的子网格。换句话说 - 我无法做到更大。
所以我的问题的精确表述是:如何找到给定二进制矩阵M
的所有最大子网格?
是否有针对此问题的现成算法?如果没有,会有什么办法?将种子放在二元矩阵中并尝试尽可能地将它们扩展到网格?