先拋出一個概念: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吧!