我如何找到与矩阵特定特征值对应的特征向量?

7

如何找出与特定特征值对应的特征向量?

我有一个随机矩阵(P),其中一个特征值为1。我需要找到与特征值1相对应的特征向量。

Scipy函数 scipy.linalg.eig 返回特征值和特征向量的数组。

D, V = scipy.linalg.eig(P)

这里的D(值数组)和V(向量数组)都是向量。

一种方法是在D中进行搜索,并提取相应的特征向量V。有更简单的方法吗?

2个回答

7
import numpy as np
import numpy.linalg as linalg


P = np.array([[2, 0, 0], [0, 1, 0], [0, 0, 3]])

D, V = linalg.eig(P)
print(D)
# [ 2.  1.  3.]

特征向量是V的列:

V = V.T

for val, vec in zip(D, V):
    assert np.allclose(np.dot(P, vec), val*vec)

因此,对应于特征值1.0的特征向量为

def near(a, b, rtol = 1e-5, atol = 1e-8):
    return np.abs(a-b)<(atol+rtol*np.abs(b))

print(V[near(D, 1.0)])
# [[ 0.  1.  0.]]

由于可能存在多个具有相同特征值的特征向量,V[near(D, 1.0)]返回一个二维数组--数组中每一行都是一个特征值为1.0的特征向量。


7
如果您要寻找与一个特定的特征值对应的特征向量,使用 scipy.sparse.linalg实现的eig函数 可能更加高效。它允许查找固定数量的特征向量并在特定值周围进行搜索。例如,您可以这样做:
values, vectors = scipy.sparse.linalg.eigs(P, k=1, sigma=1)

它是否返回P的左特征值? - AIB
1
我认为你的意思是 eigs 而不是 eig。我尝试使用 scipy.sparse.linalg.eigs(P, k=1, sigma=1),但是会引发一个异常 - raise NotImplementedError("shifted eigenproblem not supported yet") - AIB
1
固定特征值问题已更名为eigs。在我所使用的版本中(scipy 0.10.1),已经实现了带位移的特征值问题。 - Nicolas Barbey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接