在Python中的大矩阵中有效地找到所有n×m个非重叠子矩阵

时间:2017-02-23 08:53:50

标签: python algorithm python-3.x matrix

我想知道是否有一种有效的方法可以在Python中找到矩阵中所有非重叠的子矩阵。

假设我有以下矩阵(实际上是列表列表):

def generate_matrix(filename):
    """ Generate a matrix """
    return [[x for x in y] for y in map_lines(filename)]

返回示例矩阵:

[[1, 1, 1, 1, 1], [1, 0, 0, 0, 1], [1, 1, 1, 1, 1]]

或者,很好地说:

 for x in generate_matrix(filename):
     print(x)
[1, 1, 1, 1, 1]
[1, 0, 0, 0, 1]
[1, 1, 1, 1, 1]

如何有效地获取所有非重叠的子矩阵? python中是否有任何已知的算法/模块适用于具有2000行和2000列的矩阵?

我们知道我们可以按如下方式获得每个子矩阵:

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


def get_submat(matrix, start_row, end_row, start_col, end_col):
    return [i[start_col:end_col] for i in matrix[start_row:end_row]]


def get_all_sub_mat(filename, matrix):
    data = map_lines(filename)
    rows, cols = int(data[0]), int(data[1])

    for start_row, end_row in cont_in_sub_seq(list(range(rows))):
        for start_col, end_col in cont_in_sub_seq(list(range(cols))):
            yield get_submat(matrix, start_row, end_row, start_col, end_col)

然而,上面没有给出非重叠矩阵,而是所有可能的组合。欢迎任何建议!

我在搜索特定信息时才发现this,但是matlab不是我的事情,这是一个稍微不同的问题。

根据评论,还有一些额外的限制:

  • 让我们假设我们没有处理1x1矩阵。
  • 输出可以采用任何格式
  • 作为约束,我们假设矩阵中只有两个可能的值(比如01)。所以我正在寻找一种有效的输出所有子矩阵的方法,这些子矩阵至少包含每个值的x个单元格01 )和最多y个细胞。

我考虑过生成所有解决方案。但我认为这不是一个好主意。我想要生成的唯一解决方案的约束是最大化所有子矩阵中的单元总数(给定xy约束)

0 个答案:

没有答案