2012-12-04 20 views
6

मैं × एम मैट्रिक्स m की तरह एक एन मिल गया है:सब हो रही submatrices

1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 

मैं क्यू × आकार पी के सभी submatrices प्राप्त करना चाहते हैं (पी, क्यू अजीब हैं) w/ओ के लिए एक रोजगार -loop।

परिणाम s पी × क्यू × ((एन-पी + 1) · (एम-क्यू + 1)) मैट्रिक्स होना चाहिए।

उदा। अगर पी = क्यू = 3:

s(:,:,1) = [1 2 3; 5 6 7; 9 10 11] 
s(:,:,2) = [2 3 4; 6 7 8; 10 11 12] 
s(:,:,3) = [5 6 7; 9 10 11; 13 14 15] 
s(:,:,4) = [6 7 8; 10 11 12; 14 15 16] 
+0

गुणक क्यों हैं? उदाहरण के लिए। '5 6 7' दो बार प्रकट होता है। – Jonas

+0

@ जोनास क्षमा करें, मेरा उदाहरण उलझन में था। क्या अब समझना आसान है? – kay

+0

नहीं, मैं अभी भी समझ में नहीं आता: आप डुप्लिकेट प्रविष्टियां क्यों लेना चाहेंगे? बस इतना है कि आप अपनी सरणी भर सकते हैं? इसके अलावा, क्या आपने मेरे समाधान पर नजर डाली है? – Jonas

उत्तर

6

im2col आपकी सहायता कर सकते हैं:

m = 
    1  2  3  4 
    5  6  7  8 
    9 10 11 12 
    13 14 15 16 

>> P = 3; Q = 3; 
>> columnized = im2col(m,[P Q],'sliding'); 
>> nMatrices = size(columnized,2); 
>> s = reshape(columnized, [P Q nMatrices]) 

s(:,:,1) = 
    1  2  3 
    5  6  7 
    9 10 11 
s(:,:,2) = 
    5  6  7 
    9 10 11 
    13 14 15 
s(:,:,3) = 
    2  3  4 
    6  7  8 
    10 11 12 
s(:,:,4) = 
    6  7  8 
    10 11 12 
    14 15 16 

'sliding' विकल्प के साथ im2col सभी अतिव्यापी submatrices पाता है और एक (पी · क्यू) के रूप में प्रत्येक रिटर्न तत्व columnized में कॉलम वेक्टर। इन्हें वापस मैट्रिस में बदलने के लिए, हम reshape यह (पी · क्यू) × ((एन-पी + 1) · (एम-क्यू + 1)) पी × क्यू × ((एन-पी + 1) में मैट्रिक्स · (एम-क्यू + 1)) एक।