📜  构造一个矩阵,使每个像元由给定矩阵中各个像元的相邻元素之和组成(1)

📅  最后修改于: 2023-12-03 15:40:22.085000             🧑  作者: Mango

构造一个矩阵,使每个像元由给定矩阵中各个像元的相邻元素之和组成

问题描述

给定一个 $m\times n$ 的矩阵,构造一个 $m\times n$ 的矩阵,使得新矩阵中每个元素都是原矩阵中相邻元素之和。

解决方案

我们可以使用一个 $m\times n$ 的新矩阵来存储相邻元素之和。对于原矩阵中每个元素 $a_{i,j}$,我们只需要计算它上下左右四个方向的元素之和,即:

$$ b_{i,j} = a_{i-1,j}+a_{i+1,j}+a_{i,j-1}+a_{i,j+1} $$

需要注意的是,对于边界元素,我们只需考虑有值的元素。

代码实现
def adjacent_sum(matrix):
    '''
    构造一个矩阵,使每个像元由给定矩阵中各个像元的相邻元素之和组成

    Args:
        matrix: List[List[int]],一个 m×n 的矩阵

    Returns:
        List[List[int]],一个 m×n 的矩阵,每个元素都是原矩阵中相邻元素之和

    Example:
    >>> adjacent_sum([[1,2,3],[4,5,6],[7,8,9]])
    [[7, 12, 13], [16, 22, 17], [11, 22, 13]]
    '''
    m, n = len(matrix), len(matrix[0])  # 矩阵的行列数
    res = [[0]*n for _ in range(m)]  # 新矩阵
    for i in range(m):
        for j in range(n):
            # 上下左右四个方向
            left, right, up, down = j-1, j+1, i-1, i+1
            if left >= 0:  # 左
                res[i][j] += matrix[i][left]
            if right < n:  # 右
                res[i][j] += matrix[i][right]
            if up >= 0:  # 上
                res[i][j] += matrix[up][j]
            if down < m:  # 下
                res[i][j] += matrix[down][j]
    return res
测试用例
def test_adjacent_sum():
    assert adjacent_sum([[1,2,3],[4,5,6],[7,8,9]]) == [[7, 12, 13], [16, 22, 17], [11, 22, 13]]
    assert adjacent_sum([[2,2],[2,2]]) == [[4, 6], [6, 4]]
    assert adjacent_sum([[1]]) == [[0]]
    assert adjacent_sum([[1,1],[1,1]]) == [[2, 3], [3, 2]]
    print('所有测试用例通过')

test_adjacent_sum()
总结

本问题介绍了如何构造一个矩阵,使得每个像元由给定矩阵中各个像元的相邻元素之和组成。我们介绍了解决方案和代码实现,并给出了测试用例。