在matlab中寻找矩阵

时间:2017-02-24 11:04:01

标签: matlab matrix find

我的问题如下:

我有以下矩阵:

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

提前谢谢。

1 个答案:

答案 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

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

你需要更好的东西才能找到适合巨大矩阵的最佳选择。除非你可以使用这些矩阵中的某些属性(例如,零只是沿着边缘),否则你将不得不使用优化技术。您可能无法获得最佳解决方案,但这将是一个非常好的解决方案。