python中矩阵加法_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方法只能找到第一个值的索引,导致当矩阵中有重复元素时,会一直用重复元素中的第一个进行计算。

正确的做法:

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

defadd(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 inrange(len(args[0])):

row_result=[]for column inrange(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 inrange(len(args[0])):

row_result=[]for column inrange(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)returnresultexceptValueError:raise

你可能感兴趣的:(python中矩阵加法)