![](/img/trans.png)
[英]Store complex eigenvectors from linalg.eig into an array in Python
[英]Does Scipy linalg.eig produce all possible eigenvectors?
我有这个矩阵a
-
array([[2, 1],
[1, 2]])
该矩阵具有[1, 3]
特征值和以下特征向量:
array([1, -1])
array([1, 1])
但是,当我使用Scipy的linalg.eig
函数时,它将产生以下结果:
>>> linalg.eig(a)
(array([3.+0.j, 1.+0.j]), array([[ 0.70710678, -0.70710678],
[ 0.70710678, 0.70710678]]))
特征值与上面相同,但是此处产生的特征向量与前面提到的特征向量不同。
我在这里想念什么? 另外,如何找出矩阵可以具有的特征向量数量?
每个特征值有无限多个特征向量。 即,如果v
是特征向量并且a
任何非零数,则a*v
也是特征向量。 因此,任何程序都不可能返回所有特征向量。 他们要做的是返回最大的线性独立特征向量集。 可以以多种方式选择这样的集合。
对于几何多重性为1的特征值(即一维特征空间),几乎可以采用规范的选择:返回范数为1的特征向量。由于u
是归一化的特征向量,因此这里还有一定程度的任意性,因此-u
也是如此。 选择哪一个取决于算法的细节,并且可能从一个线性代数软件包到另一个线性代数软件包而有所不同。
对于几何多重性大于1的特征值(即2维或更大的特征空间),任意性程度甚至更大。 考虑矩阵
2 0
0 2
每个非零向量都是该矩阵的特征向量。 在这里,任何两个线性独立的向量都可以作为答案。 (到目前为止,SciPy返回最明显的选择:[0,1]和[1,0]-但这不是保证。)
在线性代数课程中,可能已经教过为每个本征空间选择一个正交基础。 不管是好是坏,SciPy并非如此:当本征空间的维数大于1时,它选择的依据不一定是正交的。 一个例子是矩阵
1 2 1 1
1 1 1 1
1 1 1 1
1 1 1 1
我把“ 2”放在非对称位置。
from scipy.linalg import eig
import numpy as np
m = np.ones((4, 4))
m[0, 1] = 2
evals, evecs = eig(m)
print(np.around(evals, 2))
print(np.around(evecs, 2))
打印特征值[-0.24, 4.24, 0, 0]
和相应的特征向量
[[-0.88 0.58 -0.77 -0.77]
[ 0.27 0.47 -0. -0. ]
[ 0.27 0.47 0.61 0.16]
[ 0.27 0.47 0.16 0.61]]
最后两个特征向量来自同一个特征空间(0,多重性2),因此可以选择它们彼此正交,但是SciPy却不这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.