欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

矩阵运算——矩阵乘除法python

程序员文章站 2022-07-15 10:54:46
...

哈喽,鉴于上一篇博文出现问题,此处特地开一篇,我也是一脸蒙蔽。

很多博文只会求得矩阵特征分解的特征值和特征向量,而从没有进行验证,验证方法两个

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群讨论,不设微信群

QQ群:868373192 

语音图像视频深度-学习群