python矩阵的加法,python多个矩阵相乘

  python矩阵的加法,python多个矩阵相乘

  Python矩阵乘法不使用其他库实现矩阵乘法

  不使用其他库实现矩阵乘法

  不用numpy库实现矩阵乘法看似很简单,但其中也有漏洞。例如,下面的代码:

  class mat_mul():def mm(self,A,B):row _ len=len(A)column _ len=len(B[0])cross _ len=len(B)RES _ mat=[[0]* column _ len]* row _ len for I in range(row _ len):for j in range(column _ len):for k in range(cross _ len):temp=A[I][k]* B[j]RES _ mat[I][j]=temp print === print RES _ mat def main():A

  但是最终程序运行后,结果是

  最终中间结果输出,发现问题出现在矩阵初始化阶段:

  RES _ mat=[[0]*row_len]* column _ len这里我要初始化一个全零的row_len*column_len矩阵,所以[0]* row _ len,将新生成的列表乘以coluimn_len。问题是这样的:

  在python中,如果列表乘以k,看起来列表被复制了k份。但是,事实证明,这k个链表所指向的内存中的对象只有一个,那就是原链表。也就是说,如果改变了其中一个列表,所有的k个列表都会随之改变。

  示例:

  C=[[0] * 2] * 2print before:,cc [0] [1]=3print after:,c最终输出结果:

  您可以看到,我只给第0行的第一个元素赋值3,这导致第1行的第一个元素相应地发生了变化。

  您可以使用python的id函数来查看每个列表的内存地址:

  打印ID (C [0]),ID (C [1]) 39642936 39642936。最后发现它的地址是一样的。

  所以,正确的初始化方法是:

  RES _ mat=[[0]* row _ len for I in range(column _ len)]这样最后的结果就好了。

  我一直以为自己懂python,但对它的底层实现还是知之甚少。今后我们应该更加重视这项研究。

  PS:

  列表的复制方法:

  Lista=[1,[2,3]]listb=lista[:]listb=[I for I in lista]listb=copy . copy(lista)listb=copy . deepcopy(lista)只有第五种是完全复制,其他的在不同的场合都会出现上述问题。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: