问题描述
#eigen values and vectors
a <- matrix(c(2, -1, -1, 2), 2)
eigen(a)
我试图在 R 中找到特征值和特征向量.函数 eigen
适用于特征值,但特征向量值存在错误.有什么办法可以解决吗?
I am trying to find eigenvalues and eigenvectors in R. Function eigen
works for eigenvalues but there are errors in eigenvectors values. Is there any way to fix that?
推荐答案
一些文书工作告诉你
- 特征值 3 的特征向量是
(-s, s)
对于任何非零实数值s
; - 对于任何非零实数值
t
,特征值 1 的特征向量是(t, t)
.
- the eigenvector for eigenvalue 3 is
(-s, s)
for any non-zero real values
; - the eigenvector for eigenvalue 1 is
(t, t)
for any non-zero real valuet
.
将特征向量缩放到单位长度给出
Scaling eigenvectors to unit-length gives
s = ± sqrt(0.5) = ±0.7071068
t = ± sqrt(0.5) = ±0.7071068
缩放是好的,因为如果矩阵是实对称的,特征向量的矩阵是正交的,所以它的逆是它的转置.以您的真实对称矩阵 a
为例:
Scaling is good because if the matrix is real symmetric, the matrix of eigenvectors is orthonormal, so that its inverse is its transpose. Taking your real symmetric matrix a
for example:
a <- matrix(c(2, -1, -1, 2), 2)
# [,1] [,2]
#[1,] 2 -1
#[2,] -1 2
E <- eigen(a)
d <- E[[1]]
#[1] 3 1
u <- E[[2]]
# [,1] [,2]
#[1,] -0.7071068 -0.7071068
#[2,] 0.7071068 -0.7071068
u %*% diag(d) %*% solve(u) ## don't do this stupid computation in practice
# [,1] [,2]
#[1,] 2 -1
#[2,] -1 2
u %*% diag(d) %*% t(u) ## don't do this stupid computation in practice
# [,1] [,2]
#[1,] 2 -1
#[2,] -1 2
crossprod(u)
# [,1] [,2]
#[1,] 1 0
#[2,] 0 1
tcrossprod(u)
# [,1] [,2]
#[1,] 1 0
#[2,] 0 1
如何用教科书的方法求特征向量
教科书的方法是求解齐次系统:(A - λI)x = 0
为 Null Space 基.我的这个答案中的 NullSpace
函数会很有帮助.
The textbook method is to solve the homogenous system: (A - λI)x = 0
for the Null Space basis. The NullSpace
function in my this answer would be helpful.
## your matrix
a <- matrix(c(2, -1, -1, 2), 2)
## knowing that eigenvalues are 3 and 1
## eigenvector for eigenvalue 3
NullSpace(a - diag(3, nrow(a)))
# [,1]
#[1,] -1
#[2,] 1
## eigenvector for eigenvalue 1
NullSpace(a - diag(1, nrow(a)))
# [,1]
#[1,] 1
#[2,] 1
如您所见,它们并未标准化".相比之下,pracma::nullspace
给出了标准化"的特征向量,所以你得到的东西与 eigen
的输出一致(直到可能的符号翻转):
As you can see, they are not "normalized". By contrasts, pracma::nullspace
gives "normalized" eigenvectors, so you get something consistent with the output of eigen
(up to possible sign flipping):
library(pracma)
nullspace(a - diag(3, nrow(a)))
# [,1]
#[1,] -0.7071068
#[2,] 0.7071068
nullspace(a - diag(1, nrow(a)))
# [,1]
#[1,] 0.7071068
#[2,] 0.7071068
这篇关于R 函数 eigen() 返回的特征向量是错误的吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!