矩陣運算 矩陣乘除法python

2021-10-03 08:17:28 字數 1635 閱讀 4262

很多博文只會求得矩陣特徵分解的特徵值和特徵向量,而從沒有進行驗證,驗證方法兩個

1  a*v=lam*v                    lam是特徵值

2 det(a-lam*i)=0              i是單位陣

我隨機產生的矩陣求特徵值發現有複數產生,為了方便,網上找了不是複數的矩陣。

錯誤方法復現

>>> a

array([[-1, 1, 0],

[-4, 3, 0],

[ 1, 0, 2]])

lamba,va=np.linalg.eig(a)

#the first validation

>>> np.dot(a,va)

array([[ 0. , 0.40824829, 0.40824829],

[ 0. , 0.81649658, 0.81649658],

[ 2. , -0.40824829, -0.40824829]])

>>> np.dot(np.diag(lamba),va)

array([[ 0. , 0.81649658, 0.81649658],

[ 0. , 0.81649658, 0.81649658],

[ 1. , -0.40824829, -0.40824829]])

#服不服?這是錯的

#the second validation

>>> np.linalg.det(a-np.diag(lamba))

-2.0

#崩潰不

且不說上面有個特徵值是重複的。

原因是加轉置就正確了,公式是公式,實際操作就是不一樣,不服就錯。

【其實原因是v是特徵向量,而求得是矩陣,lam是標量,得到的是向量,按照給定的1式驗證,需要驗證3次,而加轉置只需驗證一次即可】

笨方法驗證:

>>> np.dot(a,va[:,0])

array([0., 0., 2.])

>>> lamba[0]*va[:,0]

array([0., 0., 2.])

>>> np.dot(a,va[:,1])

array([ 0.40824829, 0.81649658, -0.40824829])

>>> lamba[1]*va[:,1]

array([ 0.40824829, 0.81649658, -0.40824829])

>>> np.dot(a,va[:,2])

array([ 0.40824829, 0.81649658, -0.40824829])

>>> lamba[2]*va[:,2]

array([ 0.40824829, 0.81649658, -0.40824829])

第二個驗證錯誤的原因有兩個

1)lam是向量,2式中是標量,

2)單位矩陣不是全為1的矩陣,而只有對角線上為1

【紙上得來終覺淺,絕知此事要躬行】

只有當用到的時候才知道,至於除法則是求逆矩陣即可,線性代數模組有直接的inv和pinv偽逆

不再驗證了,拜拜

qq群:868373192 

三個元素的矩陣乘除法

總結一下就是,如果a和b兩個矩陣要相乘,a的列數要和b的行數相同的,其實矩陣就是線性代數中對多項式常量的一種抽象表達。比如 a是2 80的矩陣,b是80 2的矩陣,得出的還是2 2的矩陣,簡單說就是結果是a的行 b的列的矩陣,哪怕a的列是10000呢,b的行是10000,都不影響a b的行列數,a的...

位運算乘除法

1 無符號除法 i.定點除法 對於n位dividend和divisor 1 擴充為2n 1位,但是擴充方向不一致,被除數是 000.nd 而除數是 divisor 000.2 如果dividend divisor,則dividend divisor quotient置 1 然後divisor向右移動...

python矩陣運算

python的numpy庫提供矩陣運算的功能,因此我們在需要矩陣運算的時候,需要匯入numpy的包。from numpy import 匯入numpy的庫函式 import numpy as np 這個方式使用numpy的函式時,需要以np.開頭。由一維或二維資料建立矩陣 from numpy im...