写一个函数,接收两个由嵌套列表模拟成的矩阵,返回一个嵌套列表作为计算结果,要求运行效果如下:

>>> matrix1 = [[1, 1], [-3, 4]]
>>> matrix2 = [[2, -1], [0, -5]]
>>> add(matrix1, matrix2)
[[3, 0], [-3, -1]]
>>> matrix1 = [[1, -2, 3], [-4, 5, 6], [7, -8, 9]]
>>> matrix2 = [[1, 1, 0], [1, -2, 3], [-2, 2, -2]]
>>> add(matrix1, matrix2)
[[2, -1, 3], [-3, 3, 9], [5, -6, 7]]

最初思路是这样的:

嵌套循环遍历矩阵1的数据,通过index方法获得行索引和列索引(这里大错特错了),利用索引来取得矩阵2的相同位置的数据,再进行加法。

由于忽略了index方法只能找到第一个值的索引,导致当矩阵中有重复元素时,会一直用重复元素中的第一个进行计算。

正确的做法:

直接按照索引遍历,再用多个下标操作符去取得元素的值。

def add(matrix1, matrix2):
    result = []
    for row in range(len(matrix1)):  # 行索引
        row_result = []
        for column in range(len(matrix1[row])):  # 列索引
            row_result.append(matrix1[row][column]+matrix2[row][column])  # 行结果
        result.append(row_result)  # 矩阵结果
    return result

 

这样写,只能计算两个矩阵的加法,我们需要进一步扩展这个函数的功能,比如,让它可以计算任意多个矩阵的加法

只需要改成动态参数,每个位置的结果根据矩阵个数进行相应次数的计算。主体思路不变,仍然是以第一个矩阵的索引为准,取得其他矩阵对应位置的数据相加。

def add(*args):
    result = []
    num = len(args)  # 获得矩阵个数,方便后面的计算
    for row in range(len(args[0])):
        row_result = []
        for column in range(len(args[0][row])):
            value_result = args[0][row][column]  # 存储单个数据计算结果
            for x in range(num - 1):  # 进行(矩阵数-1)次加法
                value_result += args[x + 1][row][column]
            row_result.append(value_result)
        result.append(row_result)
    return result

这时,我们还想再完善一下这个函数,矩阵加法要求矩阵的行列数必须保持一致,我们就让它能够检测传入的矩阵的一致性,并抛出异常

ValueError:Given matrices are not the same size.

再进行计算之前,先检测合法性,遍历查看后续矩阵的行列数是否和第一个矩阵相同。

这里,使用filter以数据长度为条件进行筛选,若有被筛出去的数据,就说明矩阵大小不一致。

def add(*args):
    result = []
    num = len(args)  # 获得矩阵个数,方便后面的计算
    row_num = len(args[0])
    column_num = len(args[0][0])  # 获得矩阵1的行列数,用于检测参与计算的矩阵的一致性

    try:  # 检测行数是否一致,若有被筛出去的矩阵,说明不一致
        if len(list(filter(lambda r: len(r) == row_num, args))) != num:
            raise ValueError('Given matrices are not the same size.')
        for x in range(num):  # # 检测列数是否一致,若有被筛出去的行,说明不一致
            if len(list(filter(lambda r: len(r) == column_num, args[x]))) != row_num:
                raise ValueError('Given matrices are not the same size.')

        for row in range(len(args[0])):
            row_result = []
            for column in range(len(args[0][row])):
                value_result = args[0][row][column]  # 存储单个数据计算结果
                for x in range(num - 1):  # 进行(矩阵数-1)次加法
                    value_result += args[x + 1][row][column]
                row_result.append(value_result)
            result.append(row_result)
        return result

    except ValueError:
        raise