【问题标题】:Looking for matrices in matlab在matlab中寻找矩阵
【发布时间】:2017-02-24 23:30:05
【问题描述】:

我的问题如下:

我有以下矩阵:

  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-vector,或 row-vector,以防子矩阵不可能)尽可能大。

我要解释清楚:

如果输入是第三个矩阵:

  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

提前谢谢你。

【问题讨论】:

  • 让我们删除所有的 cmets,因为它们现在只是噪音。
  • 这是一个优化问题。您想要“最好的”可能的解决方案还是“足够好”的解决方案?由于制定最优或次优解决方案的方法可能非常不同
  • @SembeiNorimaki 没关系,不是优化问题。我想要的是找到尽可能大的子矩阵,直到将所有元素聚类或分组等于 1。谢谢。没有“最好”或“足够好”的解决方案,只有“可能的解决方案”
  • 类似this?
  • 这绝对是一个优化问题,您需要为此创建一棵树并对其进行探索。而且,如果您有大型复杂矩阵,问题将变得足够困难,因此可能无法获得最佳解决方案。这就是为什么我要问“足够好”的解决方案是否可以。

标签: matlab matrix find


【解决方案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

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

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

【讨论】:

    猜你喜欢
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2016-01-25
    相关资源
    最近更新 更多