2016-02-03 88 views
5

我需要找到給定矩陣mxn的所有可能的子矩陣。我想在python中做這個,不想使用numpy。我們可以使用循環嗎?查找給定矩陣的所有子矩陣

例如:2×2矩陣

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

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

怎麼樣一個3x3矩陣?刪除一組仍然視爲子矩陣的隨機列?或者矩陣的連續部分應該被認爲是合適的子矩陣? – ssm

+0

我想你需要實現兩個函數:'Combination(x,n)'和'SubMatrix(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

謝謝你的努力,但函數沒有返回所有的矩陣。如果我在[[1,2],[2,3]]上嘗試它,它只返回[[1]]。 – pankajg

+0

@ pankajg錯過了'ContinSubSeq'中的一個'+ 1',已更正。現在就試試。 – Chiron

+0

@Chiron此代碼按預期工作。驚人。但是,那麼你可以在算法步驟中解釋一下嗎?我無法理解收益率。 – Karthik

0

我做了一個功能允許提取字模,我us'it用於提取所有可能combinaison,你會發現劇本, 這個腳本解決您的問題

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