Python实现二进制矩阵图案匹配与高亮功能的问题求助
问题修复:二进制矩阵图案匹配与高亮
原代码核心问题分析
- 矩阵生成函数错误:
create函数中的if data[j] not in matrix:是多余且逻辑错误的,导致生成的矩阵元素缺失或错位。 - 搜索逻辑完全失效:
ricerca函数未实现正确的滑动窗口匹配逻辑,仅零散收集匹配的1的位置,无法判断完整图案是否匹配。 - 高亮逻辑混乱:
coloraQuelliDelPattern仅检查连续列的三个1,未考虑垂直/水平I型图案的完整结构,导致错误高亮无关元素。
修复后的完整代码
pattern.py
# 从一维数组创建n行m列的矩阵 def create(n, m, data): matrix = [] for i in range(n): row = [] for j in range(m): # 直接按行列索引取元素,移除错误判断 row.append(data[m * i + j]) matrix.append(row) return matrix # 给元素添加高亮颜色(仅处理1,0保持默认) def color_element(element, is_highlighted=False): if element == 1: return '\u001b[36m1\u001b[00m' if is_highlighted else '1' else: return '0' # 生成垂直I型+水平I型图案,用于后续匹配 def patternI(): # 垂直I型:3行3列,第一列全1 vertical_array = [1, 0, 0, 1, 0, 0, 1, 0, 0] vertical_pattern = create(3, 3, vertical_array) # 水平I型:3行3列,第一行全1,中间列下方两个1 horizontal_array = [1, 1, 1, 0, 1, 0, 0, 1, 0] horizontal_pattern = create(3, 3, horizontal_array) print("垂直I型图案:") for row in vertical_pattern: print(' '.join([color_element(x, True) for x in row])) print("\n水平I型图案:") for row in horizontal_pattern: print(' '.join([color_element(x, True) for x in row])) return vertical_pattern, horizontal_pattern
main.py
import patterns import ricerca # 创建并打印原始5x5矩阵 def create_main_matrix(): rows = 5 cols = 5 # 修正数组长度:5x5矩阵仅需25个元素,截断原数组至符合长度 array = [0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1] matrix = patterns.create(rows, cols, array) print("原始矩阵:") for row in matrix: print(' '.join(map(str, row))) return matrix, rows, cols def main(): print("=== 待匹配图案 ===") vertical_pattern, horizontal_pattern = patterns.patternI() print("\n=== 原始矩阵 ===") main_matrix, rows, cols = create_main_matrix() print("\n=== 匹配结果(高亮为青色) ===") # 执行搜索与高亮 result_matrix = ricerca.search_and_highlight(main_matrix, rows, cols, vertical_pattern, horizontal_pattern) # 打印最终结果 for row in result_matrix: print(' '.join(row)) if __name__ == "__main__": main()
ricerca.py
import patterns # 检查大矩阵中(start_row, start_col)位置是否匹配目标图案 def is_match(matrix, start_row, start_col, pattern): pattern_rows = len(pattern) pattern_cols = len(pattern[0]) # 检查是否超出大矩阵边界 if start_row + pattern_rows > len(matrix) or start_col + pattern_cols > len(matrix[0]): return False # 逐元素匹配:仅要求图案中的1与大矩阵对应位置一致,0的位置不强制匹配 for i in range(pattern_rows): for j in range(pattern_cols): if pattern[i][j] == 1 and matrix[start_row + i][start_col + j] != 1: return False return True # 搜索所有匹配的图案位置,并生成带高亮的结果矩阵 def search_and_highlight(matrix, mat_rows, mat_cols, vertical_pattern, horizontal_pattern): # 创建标记矩阵,记录哪些位置需要高亮 highlight_mask = [[False for _ in range(mat_cols)] for _ in range(mat_rows)] pattern_size = 3 # 图案为3x3规格 # 搜索垂直I型图案 for row in range(mat_rows - pattern_size + 1): for col in range(mat_cols - pattern_size + 1): if is_match(matrix, row, col, vertical_pattern): # 标记垂直I型的所有1的位置 for i in range(3): highlight_mask[row + i][col] = True # 搜索水平I型图案 for row in range(mat_rows - pattern_size + 1): for col in range(mat_cols - pattern_size + 1): if is_match(matrix, row, col, horizontal_pattern): # 标记水平I型的所有1的位置 highlight_mask[row][col] = True highlight_mask[row][col+1] = True highlight_mask[row][col+2] = True highlight_mask[row+1][col+1] = True highlight_mask[row+2][col+1] = True # 根据标记生成带颜色的结果矩阵 result = [] for i in range(mat_rows): row_result = [] for j in range(mat_cols): row_result.append(patterns.color_element(matrix[i][j], highlight_mask[i][j])) result.append(row_result) return result
修复说明
- 矩阵生成修复:移除
create函数中错误的判断条件,严格按行列索引生成矩阵,避免元素缺失。 - 匹配逻辑重构:实现
is_match函数,采用滑动窗口遍历大矩阵所有可能的起始位置,仅验证图案中1的位置是否匹配,符合二进制图案匹配的常见需求。 - 高亮逻辑优化:使用独立的
highlight_mask矩阵标记需要高亮的位置,避免直接修改原矩阵,最后统一生成带颜色的结果。 - 双图案支持:同时处理垂直和水平I型图案的搜索与高亮,覆盖需求中的两种匹配场景。
- 数组长度修正:原main.py中的数组长度超出5x5矩阵需求,已截断至正确长度。
内容的提问来源于stack exchange,提问作者la_llum
相关产品推荐
相关产品推荐

