2016-02-03 27 views
5

के सभी सबमिटर खोजें मुझे किसी दिए गए मैट्रिक्स एमएक्सएन के सभी संभावित उप-मैट्रिक्स खोजने की आवश्यकता है। मैं इसे अजगर में करने की कोशिश कर रहा हूं और numpy का उपयोग नहीं करना चाहता। क्या हम केवल लूप्स का उपयोग करके ऐसा कर सकते हैं?किसी दिए गए मैट्रिक्स

उदाहरण के लिए: 2x2 मैट्रिक्स

Matrix = [ 
      [1, 2], 
      [3, 4] 
     ] 

Submatrices =[ [1], 
       [1,2], 
       [2], 
       [3], 
       [4], 
       [3, 4], 
       [[1], [3]], 
       [[2],[4]], 
       [[1,2],[3,4]] ] 
+1

क्या एक 3x3 मैट्रिक्स के बारे में? यादृच्छिक स्तंभों के समूह को हटा रहा है अभी भी एक submatrix माना जाता है? या मैट्रिक्स के एक संगत खंड को उचित सबमिट्रिक्स माना जाना चाहिए? – ssm

+0

मुझे लगता है कि आपको दो कार्यों को लागू करने की आवश्यकता है: 'संयोजन (एक्स, एन) 'और' सबमैट्रिक्स (x_start, x_end, y_start, y_end) '। और इसे हल किया जाना चाहिए – Chiron

+0

@ssm मैट्रिक्स का एक संगत खंड उचित सबमिट्रिक्स माना जाना चाहिए। – pankajg

उत्तर

3

मैट्रिक्स मान लिया जाये कि

Matrix = [ 
     [1, 2,3], 
     [3, 4,5], 
     [5,6,7] 
    ] 

स्प्लिट में 3 समारोह:

def ContinSubSeq(lst): 
    size=len(lst) 
    for start in range(size): 
    for end in range(start+1,size+1): 
     yield (start,end) 

def getsubmat(mat,start_row,end_row,start_col,end_col): 
    return [i[start_col:end_col] for i in mat[start_row:end_row] ] 

def get_all_sub_mat(mat): 
    rows = len(mat) 
    cols = len(mat[0]) 
    for start_row,end_row in ContinSubSeq(list(range(rows))): 
    for start_col,end_col in ContinSubSeq(list(range(cols))): 
     yield getsubmat(mat,start_row,end_row,start_col,end_col) 

भागो इस

for i in get_all_sub_mat(Matrix): 
    print i 

या सरल, एक समारोह में डाल दिया:

def get_all_sub_mat(mat): 
    rows = len(mat) 
    cols = len(mat[0]) 
    def ContinSubSeq(lst): 
     size=len(lst) 
     for start in range(size): 
      for end in range(start+1,size+1): 
       yield (start,end) 
    for start_row,end_row in ContinSubSeq(list(range(rows))): 
     for start_col,end_col in ContinSubSeq(list(range(cols))): 
      yield [i[start_col:end_col] for i in mat[start_row:end_row] ] 
+0

प्रयासों के लिए धन्यवाद, लेकिन फ़ंक्शन सभी matrices वापस नहीं कर रहा है। अगर मैं इसे [[1, 2], [2, 3] पर आज़माता हूं] यह केवल [[1]] लौट रहा है। – pankajg

+0

@ पंकजग ने 'ContinSubSeq' में' + 1' को याद किया, ठीक किया गया। अब इसे आजमाओ। – Chiron

+0

@Chiron यह कोड अपेक्षित के रूप में काम करता है। गजब का। लेकिन फिर क्या आप इसे एल्गोरिदमिक चरणों में समझा सकते हैं? मुझे उपज को समझने में परेशानी हो रही है। – Karthik

0

मैंने बनाया एक समारोह मैट्रिक्स से मैट्रिक्स को निकालने के लिए, आप स्क्रिप्ट मिल जाएगा अनुमति देते हैं, और मैं निकालने के लिए सभी संभव combinaison us'it, इस स्क्रिप्ट का समाधान अपने समस्या

def extract(mat, n, n1, m, m1): 
    l=[] 
    for i in range(n-1, n1): 
     r=[] 
     for j in range(m-1, m1): 
      if mat[i][j] != []: 
       r.append(mat[i][j]) 
     l.append(r) 
return l 

# set 1 in i1 and j1 
# set dimension+1 in i2 and j2 
res = [] 
for i1 in range(1, 3): 
    for i2 in range(1,3): 
     for j1 in range(1, 3): 
      for j2 in range(1, 3): 
       li= extract(mat, i1,i2,j1,j2) 
       if li !=[] and i2 >= i1 and j2>=j1 : 
        res.append(li) 

print res 
0
def all_sub(r, c, mat): # returns all sub matrices of order r * c in mat 
    arr_of_subs = [] 
    if (r == len(mat)) and (c == len(mat[0])): 
      arr_of_subs.append(mat) 
      return arr_of_subs 
    for i in range(len(mat) - r + 1): 
     for j in range(len(mat[0]) - c + 1): 
      temp_mat = [] 
      for ki in range(i, r + i): 
       temp_row = [] 
       for kj in range(j, c + j): 
        temp_row.append(mat[ki][kj]) 
       temp_mat.append(temp_row) 
      arr_of_subs.append(temp_mat) 
    return arr_of_subs 
+0

कृपया अपने कोड में कुछ जानकारी जोड़ें। – MrLeeh

संबंधित मुद्दे