You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现二进制矩阵图案匹配与高亮功能的问题求助

问题修复:二进制矩阵图案匹配与高亮

原代码核心问题分析

  1. 矩阵生成函数错误:create函数中的if data[j] not in matrix:是多余且逻辑错误的,导致生成的矩阵元素缺失或错位。
  2. 搜索逻辑完全失效:ricerca函数未实现正确的滑动窗口匹配逻辑,仅零散收集匹配的1的位置,无法判断完整图案是否匹配。
  3. 高亮逻辑混乱: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

修复说明

  1. 矩阵生成修复:移除create函数中错误的判断条件,严格按行列索引生成矩阵,避免元素缺失。
  2. 匹配逻辑重构:实现is_match函数,采用滑动窗口遍历大矩阵所有可能的起始位置,仅验证图案中1的位置是否匹配,符合二进制图案匹配的常见需求。
  3. 高亮逻辑优化:使用独立的highlight_mask矩阵标记需要高亮的位置,避免直接修改原矩阵,最后统一生成带颜色的结果。
  4. 双图案支持:同时处理垂直和水平I型图案的搜索与高亮,覆盖需求中的两种匹配场景。
  5. 数组长度修正:原main.py中的数组长度超出5x5矩阵需求,已截断至正确长度。

内容的提问来源于stack exchange,提问作者la_llum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 00:21:43