zoukankan      html  css  js  c++  java
  • python 用嵌套列表做矩阵加法

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

    >>> 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
  • 相关阅读:
    如何用伪类画出一个三角形
    关于昨天遇到题目的一点随笔
    opacity与rgba
    选择框脚本_移动/重排选项 P435
    文字等宽
    CSS3风骚渐变
    表单序列化 P436
    选择框脚本_添加/删除选项 P434
    选择框脚本_用事件选中选项,获取选中项信息 P432
    文本框组脚本_自动切换焦点“例如加区号和分机号的电话号码文本框组” P426
  • 原文地址:https://www.cnblogs.com/pyonwu/p/10592991.html
Copyright © 2011-2022 走看看