簡體   English   中英

在matlab中尋找矩陣

[英]Looking for matrices in 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-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代表。

然后,有三個元素,但是。 所以我想再次分組。 再次獲取最大的子矩陣(或子向量)。 那時,根據之前的舉動,我們將獲得:

  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

請注意,此代碼不能直接使用,但應該很容易修復它。 顯然,這種方法僅適用於小型矩陣 - 對於任何大型矩陣來說都太慢了。 有一些小的優化是微不足道的,但不會有太大變化。

你需要更好的東西才能找到適合巨大矩陣的最佳選擇。 除非你可以使用這些矩陣中的某些屬性(例如,零只是沿着邊緣),否則你將不得不使用優化技術。 您可能無法獲得最佳解決方案,但這將是一個非常好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM