如何找到N * N矩阵的所有子矩阵?

时间:2020-07-21 22:31:32

标签: python algorithm matrix

假设我们有一个矩阵A,

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

我想找到所有子矩阵,即

1,2,3,4,(1,2),(3,4),(1,3),(2,4),(1,2,3,4)

使用基本的for循环。我尝试过,但是无法给出正确的结果。

def mtx(arr):
    n = len(arr)
    for i in range(n,1,-1):
        off_cnt = n - i + 1
        for j in range(off_cnt):
            for k in range(off_cnt):
                for p in range(i):
                    for q in range(i):
                        print(arr[p+j][q+k])
                    print('--------')
# print(mtx(a)

1 个答案:

答案 0 :(得分:1)

您需要找到所有大小为N * N的子矩阵,假设它们是大小为H * W的矩阵,其中H和W的范围是1到N(包括)-这是您的for循环的第一个范围。然后,您需要从所有可能的起始坐标创建此大小的所有子矩阵,这意味着给定的子矩阵可能从x,y位置开始;其中,x,y从起始索引(假设为0)到最后一个可能的索引,范围是x N-W(包括)和y N-H(包括)。以上任何内容都不适合。然后,只需填充您的子矩阵,然后执行所需的任何操作(打印出来?),如下代码所示:

def print_submatrices(matrix):
    
    # all possible submatrices heights
    for height in range(1, len(matrix)+1): 
        
        # all possible submatrices width
        for width in range(1, len(matrix[0]) + 1): 
            
            # create empty submatrix of given size
            template = list()
            for i in range(height):
                template.append([None]*width)
                
            # fill submatrix
            for y in range(len(matrix) - height + 1): # every possible start on y axis
                for x in range(len(matrix[0]) - width + 1): # every possible start on x axis
                    
                    # fill submatrix of given size starting at y, x coords
                    for i in range(y, y + height):
                        for j in range(x, x + width):
                            template[i-y][j-x] = matrix[i][j]
                            
                    # when the matrix is filled, print it
                    print(template)