[英]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.