寻找矩阵在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 

在此先感谢您。

+1

让我们删除所有的评论,因为他们现在只是噪音。 –

+0

这是一个优化问题。你想要“最好的”可能的解决方案或解决方案“够好”?由于制定最优或次优解决方案的方法可能会非常不同 –

+0

@SembeiNorimaki无所谓,它不是一个优化问题。我想要的是找到尽可能最大的子矩阵,直到将所有元素聚类或组合为1为止。谢谢。没有“最好”或“足够好”的解决方案,有“可能的解决方案” –

它不会很快,但蛮力强制你的方式将工作(小问题)。伪代码如:

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 

请注意,此代码不会直接工作,但它应该很容易修复。 显然这种方法只适用于小矩阵 - 对于任何大的矩阵都太慢。有一些小的优化是微不足道的,但不会有太大的改变。

你需要更好的东西来找到最佳的巨大矩阵。除非你可以使用这些矩阵中的某些属性(例如零仅在边上),否则必须使用优化技术。你可能不会得到最优化的解决方案,但它会是一个非常好的解决方案。