【问题标题】:How to obtain right eigenvectors of matrix in R?如何在R中获得矩阵的右特征向量?
【发布时间】:2013-02-16 16:07:37
【问题描述】:

版本:我的问题是我试图从equation 8 中找到矩阵S,但这个方程有错误。

如何直接获得R中矩阵的右特征向量? 'eigen()' 只给出左特征向量

真的是上一版,我把这里弄得一团糟,但这个问题对我来说真的很重要:

eigen() 提供了一些特征向量的矩阵,来自函数帮助:

" 如果'r

                      A = V Lmbd V^(-1)                         

(直到数字模糊),其中Lmbd =diag(lam)"

那是A V = V Lmbd,其中 V 是 矩阵 现在我们检查一下:

set.seed(1)
A<-matrix(rnorm(16),4,4)
Lmbd=diag(eigen(A)$values)
V=eigen(A)$vectors
A%*%V

> A%*%V
                      [,1]                  [,2]          [,3]           [,4]
[1,]  0.0479968+0.5065111i  0.0479968-0.5065111i  0.2000725+0i  0.30290103+0i
[2,] -0.2150354+1.1746298i -0.2150354-1.1746298i -0.4751152+0i -0.76691563+0i
[3,] -0.2536875-0.2877404i -0.2536875+0.2877404i  1.3564475+0i  0.27756026+0i
[4,]  0.9537141-0.0371259i  0.9537141+0.0371259i  0.3245555+0i -0.03050335+0i
> V%*%Lmbd
                      [,1]                  [,2]          [,3]           [,4]
[1,]  0.0479968+0.5065111i  0.0479968-0.5065111i  0.2000725+0i  0.30290103+0i
[2,] -0.2150354+1.1746298i -0.2150354-1.1746298i -0.4751152+0i -0.76691563+0i
[3,] -0.2536875-0.2877404i -0.2536875+0.2877404i  1.3564475+0i  0.27756026+0i
[4,]  0.9537141-0.0371259i  0.9537141+0.0371259i  0.3245555+0i -0.03050335+0i

我想找到右特征向量矩阵R
定义左特征向量矩阵L的方程是:

L A  = LambdaM L

定义右特征向量矩阵R的方程是:

A R = LambdaM R

而 eigen() 只提供矩阵V:

A V = V Lmbd

我想获得矩阵RLambdaM 的实矩阵A,这可能是负定的。

【问题讨论】:

  • 但是 transpose 给出了转置矩阵的右特征向量,不是吗?
  • eigen() 在我看来,正如我所料,正在返回正确的特征向量。试试这个看看它确实有效:m &lt;- matrix(1:4, ncol=2); e &lt;- eigen(m); e$values[1]; (m %*% e$vectors[,1])/e$vectors[,1].
  • @BenBolker -- 比较这两者,看看你的粗体陈述是不是真的:W &lt;- matrix(1:4, ncol=2); lambda &lt;- diag(1:2); W %*% lambda; lambda %*% W。我认为 OP 的困惑是一个(很容易理解的)符号。当 Wvector 时,标量 lambda 的左右乘法是等价的,但乘积通常是这样写的:拉姆达W。当W是一个矩阵时,它必须是-乘以矩阵Lambda,像这样:W 拉姆达。 (比较等式 (1) 和 (14) here, for example)。
  • 还是不太对!请参阅上面引用的 Mathworld 站点。当用单个特征向量/特征值对表示时,A r == lambda r 为真(等式 1)。当用特征值矩阵表示时,正确的表达式是A R == R Lambda(等式14:在Mathworld的符号中,A X_R == X_R D)。所以事实上eigen 给你的正确的特征向量矩阵,正如传统定义的那样。我认为您想要一些不同的东西,这很好,但请准确(并仔细检查我的说法,因为我至少已经错了一次)。
  • @Josh O'Brien 感谢您的帮助!我已经实现了整个第 3 节,它的工作原理如第 4 节所示,定义(8)确实有一个错误。

标签: r function eigenvector eigenvalue


【解决方案1】:

一个有效的例子。

默认(= 正确个特征向量):

m <- matrix(1:9,nrow=3)
e <- eigen(m)
e1 <- e$vectors
zapsmall((m %*% e1)/e1) ## right e'vec
##          [,1]      [,2] [,3]
## [1,] 16.11684 -1.116844    0
## [2,] 16.11684 -1.116844    0
## [3,] 16.11684 -1.116844    0

左特征向量:

eL <- eigen(t(m))    
eL1 <- eL$vectors

(我们需要付出更多的努力,因为我们需要 乘以左边的行向量;如果 我们只提取了一个特征向量,R 的无知 行/列向量的区别将使它 “做正确的事”(即(eL1[,1] %*% m)/eL1[,1] 只是工作)。)

zapsmall(t(eL1) %*% m/(t(eL1)))
##          [,1]      [,2]      [,3]
## [1,] 16.116844 16.116844 16.116844
## [2,] -1.116844 -1.116844 -1.116844
## [3,]  0.000000  0.000000  0.000000

【讨论】:

  • 我现在没时间回答您编辑的问题。您可以尝试根据迄今为止在此处发布的内容来回答您自己的问题,或者等待其他人来解答...
【解决方案2】:

这应该可以工作

给定一个矩阵 A。

lefteigen  <-  function(A){
  return(t(eigen(t(A))$vectors))
}

每个左特征向量都是矩阵转置的右特征向量的转置

【讨论】:

  • 但它们通常不会是正交的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2018-08-06
  • 2014-07-12
  • 1970-01-01
  • 2018-10-12
  • 2019-04-27
  • 2012-08-08
相关资源
最近更新 更多