2017-02-24 119 views
1

我的問題如下:尋找矩陣在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爲止。謝謝。沒有「最好」或「足夠好」的解決方案,有「可能的解決方案」 –

回答

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 

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

你需要更好的東西來找到最佳的巨大矩陣。除非你可以使用這些矩陣中的某些屬性(例如零僅在邊上),否則必須使用優化技術。你可能不會得到最優化的解決方案,但它會是一個非常好的解決方案。