寻找矩阵在MATLAB
问题描述:
我的问题如下:寻找矩阵在MATLAB
我有以下矩阵:
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
或
1 1 1 0
1 1 1 2
0 3 3 0
我想是让子矩阵(或COL-载体,或行向量的情况下,该子矩阵是不可能的),如尽可能大。
我将清楚地解释:
如果输入是第三矩阵:
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
表示。
然后,有三个元素与1,但。所以我想再次分组。再次获取最大的子矩阵(或子矢量)。在这一点上,根据之前的举动,我们将得到:
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
然后,小组最后一个元素独自:
x x x
x x x
0 y 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
请注意,此代码不会直接工作,但它应该很容易修复。 显然这种方法只适用于小矩阵 - 对于任何大的矩阵都太慢。有一些小的优化是微不足道的,但不会有太大的改变。
你需要更好的东西来找到最佳的巨大矩阵。除非你可以使用这些矩阵中的某些属性(例如零仅在边上),否则必须使用优化技术。你可能不会得到最优化的解决方案,但它会是一个非常好的解决方案。
让我们删除所有的评论,因为他们现在只是噪音。 –
这是一个优化问题。你想要“最好的”可能的解决方案或解决方案“够好”?由于制定最优或次优解决方案的方法可能会非常不同 –
@SembeiNorimaki无所谓,它不是一个优化问题。我想要的是找到尽可能最大的子矩阵,直到将所有元素聚类或组合为1为止。谢谢。没有“最好”或“足够好”的解决方案,有“可能的解决方案” –