先抛出一个概念:python
左乘:设A为m*p的矩阵,B为p*n的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积,记做C=AB,称为A左乘以B。数组
左乘是作行变换;ide
用对角阵左乘一个矩阵,就是用对角阵的对角元分别乘这个矩阵的对应各行;spa
右乘:设A为m*p的矩阵,B为p*n的矩阵,那么度称m*n的矩阵C为矩阵A与B的乘积,记做版C=AB,称为B右乘以A。code
右乘是作列变换;get
用对角阵右乘一个矩阵,就是用对角阵的对角元分别乘这个矩阵的对应各列。it
而后说结论:千万别用python的numpy进行矩阵计算!!!!!!!!!!!!class
(1)若是经过numpy包进行矩阵计算,可能把数组误认为矩阵!import
好比numpy.diag([1,2,3]),返回是对角矩阵的形式,你觉得是矩阵,实际上是数组!numpy
当你发现全部矩阵乘法都变成数组乘法的时候,很恐怖的一件事!
(2)若是你必定要用numpy,慎用星号*表示乘法!
若是A和B都是数组,A*B是数组乘法(对应元素相乘),返回数组;
若是A和B中有一个是矩阵,A*B默认变成矩阵运算(行列式相乘),返回矩阵;
(3)若是你必定要用numpy,千万不要用1表示单位矩阵;
1-A,若是A是数组,这里的1默认为全1数组(非单位矩阵的形式);
1-A,若是A是矩阵,这里的1默认为全1矩阵(非单位矩阵的形式);
真正的单位矩阵,只有对角线元素为1,其余元素为0,用 np.identity(N) 生成单位矩阵;
(4)np.dot(A, B) 是作矩阵运算,可是返回值倒是数组!
举个例子:在python中,矩阵与数组采用np.dot()计算时,虽然是矩阵计算,可是所得结果均为一个数组;
数组在前时,可按照将数组当作1行n列的矩阵,与矩阵相乘,可得计算结果。但需注意计算结果依然只是数组,及其shape为(k,)形式,而不是(1,k);
最后附上代码供理解:
import numpy as np a = np.diag([1,2,3]) b = np.diag([4,5,6]) c = np.array([[0.1,0.2,0.3],[0.4,0.5,0.6],[0.7,0.8,0.9]]) print("\n区分 h_stack 和 column_stack") print(np.hstack((a, b))) print(np.column_stack((a, b))) print("\n区分 数组乘法 和 矩阵乘法") print(type(a*c)) print(a*c) print(type(a.dot(c))) print(a.dot(c)) # 虽然是矩阵乘法,但返回值为数组 print("\n区分 全1数组 和 单位矩阵") print(type(1-a)) print(1-a) print(type(np.identity(3)-a)) print(np.identity(3)-a) print("\n数组乘法:(全1数组-a)*对角数组 = (单位数组-a)*对角数组") print((1-a)*b) print((np.diag([1,1,1])-a)*b) print("\n矩阵乘法:全1矩阵x对角数组) != 单位数组x对角数组)") print((1-a).dot(b)) print(b.dot(1-a)) print(np.dot(1-a, b)) print(np.dot(b, 1-a)) print("\n对角数组 x 数组 = 两个数组对角元素相乘") print(type(a*c)) print(a*c) print("\n对角数组 x 矩阵 = 对角阵的对角元分别乘这个矩阵的对应各行") d = np.mat(c) print(type(a*d)) print(a*d)
换matlab吧!