我的问题如下:
我有以下矩阵:
TopNav
或
0 1
1 1
或
1 1 1
1 1 1
0 1 0
我想获得以下矩阵:
1 1 1 0
1 1 1 1
0 1 1 0
或
0 1
2 1
或
1 1 1
1 1 1
0 2 0
我想要的是尽可能大地获取子矩阵(或col-vector,或者在不可能的子矩阵的情况下使用行向量)。
我要清楚解释一下:
如果输入是第三个矩阵:
1 1 1 0
1 1 1 2
0 3 3 0
我想垂直或水平地对元素进行分组,使这些子矩阵尽可能大。此示例中最大的子矩阵是:
1 1 1 0
1 1 1 1
0 1 1 0
另一个可能的子矩阵,也是最大的:
x x x 0
x x x 1
0 1 1 0
两者均由 1 x x 0
1 x x 1
0 x x 0
表示。
然后,有三个元素,但是。所以我想再次分组。再次获取最大的子矩阵(或子向量)。那时,根据之前的举动,我们将得到:
x
或
x x x 0
x x x 1
0 y y 0
由 y x x 0
y x x 1
0 x x 0
代表。
现在,我们有另一个元素,没有被分组,现在我们创建另一个组(由y
表示):
z
如果现在我们选择其他输入,我们有以下步骤:
y x x 0
y x x z
0 x x 0
我们有两个子矢量,所以我们有两种可能的解决方案:
0 1
1 1
或
0 1
x x
然后,根据所选择的解决方案,我们有以下解决方案:
0 x
1 x
或
0 y
x x
单独对其他元素进行分组。
最后,在第二种情况下,我们只有一种可能的解决方案:
0 x
y x
获得最大的子矩阵我们有这个解决方案:
1 1 1
1 1 1
0 1 0
然后,将最后一个元素分组:
x x x
x x x
0 1 0
提前谢谢。
答案 0 :(得分:0)
它不会很快,但是粗暴强迫你的方式会起作用(对于小问题)。伪代码如:
A = [1, 0; 1, 1];
B = zeros(size(A));
bCount = 1;
while any(A ~= 0)
globalmax = 0;
for i,j = 1 : sizeOfMatrix
localmax = 0;
for ii,jj = i,j : sizeOfMatrix
if ((ii-i+1) * (jj-j+1) > localmax ... &&
&& all(A(i:ii, j:jj) ~= 0))
localmax = (ii-i+1) * (jj-j+1);
localmaxPoints = [i, ii; j, jj];
end
end
if (localmax > globalmax)
globalmax = localmax;
globalmaxPoints = localmaxPoints;
end
end
A[globalmaxPoints] = 0;
B[globalmaxPoints] = bCount;
bCount = bCount+1;
end
请注意,此代码不会直接使用,但应该很容易修复它。 显然,这种方法仅适用于小型矩阵 - 对于任何大型矩阵来说都太慢了。有一些小的优化是微不足道的,但不会有太大变化。
你需要更好的东西才能找到适合巨大矩阵的最佳选择。除非你可以使用这些矩阵中的某些属性(例如,零只是沿着边缘),否则你将不得不使用优化技术。您可能无法获得最佳解决方案,但这将是一个非常好的解决方案。