2012-06-21 73 views
1

enter image description here Supose我有一個矩陣。除了創建具有相同大小的矩形的某些點之外,此矩陣是空白的。每個創建矩形的點都有一個正數,該矩形的所有點都是相等的。這個矩陣可能有幾個矩形,每個矩形都有相同的數字。Octave中的重疊二維矩陣

想象一下,現在我有第二個具有相同結構的矩陣,但現在矩形在其他位置具有其他大小和其他值,如矩陣A和B在圖片中。

我想結合這兩個矩陣,所以如果有一個矩形的intertection,具有最小數量的矩形被刪除。

這是最好的辦法嗎?我認爲做fors可能是可行的,但我想做30次,所以如果我沒有改進,Octave需要很長時間才能完成它。

+0

如果重疊有相同的價值觀 – amitkarmakar

+0

在我的應用程序是非常奇怪的是,這種情況發生的矩形然後抹掉你想要的那個。 –

+0

使用'for's並不一定意味着它會比oneliner效率低。相反,將你的問題強行擠壓成幾個函數可能會得到相反的結果。如果性能是你的約束條件,我會建議你用最有效的方式來管理,然後將它與答案中的緊湊解決方案進行比較。 –

回答

2

我做這個小碼,似乎做的工作:

A=[0 0 1 1 1 0 ; 
    0 0 1 1 1 0 ; 
    0 0 0 0 0 0 ; 
    2 2 0 0 0 0 ; 
    2 2 0 0 0 0 ; 
    2 2 0 0 0 0 ]; 

B=[3 0 2 2 0 0 ; 
    3 0 2 2 0 0 ; 
    0 0 2 2 0 0 ; 
    0 0 0 0 0 0 ; 
    1 1 1 1 1 0 ; 
    1 1 1 1 1 0 ]; 


%give a unique id to each rectangle 
lblA=bwlabel(A); 
lblB=bwlabel(B); 

%search for overlap 
overlap= A & B; 

% find out overlaping rectangle s unique id 
overlapLbl= unique([lblA(overlap(:)) lblB(overlap(:))],'rows'); 

%eliminate rectangle with lower score 
for ov=1:size(overlapLbl,1) 
    scoreA=A(find((lblA==overlapLbl(ov,1)),1)); 
    scoreB=B(find((lblB==overlapLbl(ov,2)),1)); 
    if scoreA>scoreB 
    B(B==scoreB)=0; 
    else 
    A(A==scoreA)=0; 
    end 
end 
C=A+B 

輸出:

C = 
    3  0  2  2  0  0 
    3  0  2  2  0  0 
    0  0  2  2  0  0 
    2  2  0  0  0  0 
    2  2  0  0  0  0 
    2  2  0  0  0  0 
+0

太棒了。那正是我正在尋找的。我知道我應該在一個新問題中提出這個問題,但是,是否可以從單選點創建單節,因此最終它們不會重疊?我的意思是,我沒有矩形。我有點,然後我創建矩形,因爲我需要它們,但我的方式是做fors,所以我添加相同的矩陣多次我需要水平和垂直多個,所以在最後矩形創建,但我不認爲關於它們在創建時是否重疊 –