先抛出一个概念:
左乘:设A为m*p的矩阵,B为p*n的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积,记作C=AB,称为A左乘以B。
左乘是做行变换;
用对角阵左乘一个矩阵,就是用对角阵的对角元分别乘这个矩阵的对应各行;
右乘:设A为m*p的矩阵,B为p*n的矩阵,那么度称m*n的矩阵C为矩阵A与B的乘积,记作版C=AB,称为B右乘以A。
右乘是做列变换;
用对角阵右乘一个矩阵,就是用对角阵的对角元分别乘这个矩阵的对应各列。
然后说结论:千万别用python的numpy进行矩阵计算!!!!!!!!!!!!
(1)如果通过numpy包进行矩阵计算,可能把数组误认为矩阵!
比如numpy.diag([1,2,3]),返回是对角矩阵的形式,你以为是矩阵,其实是数组!
当你发现所有矩阵乘法都变成数组乘法的时候,很恐怖的一件事!
(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吧!