我有一个问题,关于scipy.linalg.eig如何计算左右特征向量。也许我误解了一切,但事情似乎对我来说不太对...
从一开始。为了获得特征值和两个特征向量,我使用了以下方法:
ev,left_v,right_v = scipy.linalg.eig(A,left = True)
根据手册,在调用函数时设置left=True
后,我应该期望得到左特征向量作为left_v
的列,其中第i列是第i个特征值的左特征向量。然而,结果并不是我预期的,所以我进行了简单的检查。
我两次调用该函数来计算右特征向量和左特征向量(详情请见这里):
right_ev, right_v_2 = scipy.linalg.eig(A)
left_ev, left_v_2 = scipy.linalg.eig(A.T)
left_v_2
的列是与left_ev
中相应值相关联的特征向量。
需要强调的是,right_ev_2
和left_ev_2
都给出了相同的特征值,但它们的顺序不同,这需要加以考虑。
将left_ev
和left_ev_2
(根据特征值重新排序后)进行比较,可以快速发现前者是后者的共轭,因此使用scipy.linalg.eig
和left=True
得到的left_ev
不是有效的左特征向量。
还可以基于以下事实对特征向量的有效性进行检查:对于任意实方阵,左右特征向量是双正交的,即:
left_v.T.dot(right_v)
应该给出一个对角矩阵,但它没有,
直到我将其更改为:left_v.T.conj().dot(right_v)
,
而:
left_v_2.T.dot(right_v_2)
给出了预期的对角矩阵。
有人遇到过类似的问题吗?我的说法正确吗?SciPy手册在描述eig
时是否有些不准确?你能给出任何建议吗?
非常感谢!
vl
的共轭转置是按照常用约定左特征向量。现在问题是为什么eig
函数提供了这种模棱两可的信息? - MKK_A = np.array([ [0., -1], [1, 0] ]); w, L, R = eig(A, left=True, right=True); print "L* . R: \n", L.conj().T.dot(R)
得到的结果是- I
,如果你期望得到I
的话就会有问题。一般来说它可能是np.diag( 1 -1 -1 1 )
,所以没有快速解决方案?(版本:numpy 1.14.1,scipy 1.0.0,python 2.7.14,mac 10.10.5) - denisL.conj().T.dot(R)
必须是对角线,但不一定是单位矩阵。存在左右特征向量使得它们的乘积是单位矩阵,但eig
不能保证计算出这样的特征向量。 - Warren Weckesser