当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R eigen 矩阵的谱分解


R语言 eigen 位于 base 包(package)。

说明

计算数值(双精度、整数、逻辑)或复矩阵的特征值和特征向量。

用法

eigen(x, symmetric, only.values = FALSE, EISPACK = FALSE)

参数

x

要计算其谱分解的数值或复数矩阵。逻辑矩阵被强制转换为数字。

symmetric

如果 TRUE ,则假定矩阵是对称的(如果复数则为埃尔米特矩阵),并且仅使用其下三角形(包括对角线)。如果未指定symmetric,则使用isSymmetric(x)

only.values

如果 TRUE ,则仅计算并返回特征值,否则返回特征值和特征向量。

EISPACK

合乎逻辑的。已失效并被忽视。

细节

如果未指定symmetric,则isSymmetric(x) 确定矩阵是否对称,直至出现可能的数值误差。自己设置该值更可靠且通常更快。

对于大型矩阵来说,计算特征向量是最慢的部分。

在 real-world 计算机上计算矩阵的特征分解会出现错误:最终的分析是 Wilkinson (1965)。您所希望的只是一个与 x 相当接近的问题的解决方案。因此,即使实数不对称 x 可能具有具有重复实特征值的代数解,计算出的解也可能是具有复共轭特征值对的类似矩阵。

底层 LAPACK 代码的不成功结果将导致错误,并给出正错误代码(最常见的是 1 ):这些只能通过详细研究 FORTRAN 代码来解释。

x 中缺少 NaN 或无限值将给出错误。

x 的谱分解以包含组件的列表形式返回

values

包含 x 特征值的向量,根据非对称情况下的 Mod(values) 按降序排序,当它们可能很复杂时(即使对于实矩阵)。对于实数不对称矩阵,仅当检测到复数共轭特征值对时,向量才是复数。

vectors

其列包含 x 的特征向量的 矩阵,或 NULL (如果 only.valuesTRUE )。向量被标准化为单位长度。

回想一下,特征向量仅定义为一个常数:即使指定了长度,它们仍然仅定义为模一标量(实矩阵的符号)。

only.values 不为 true 时,默认情况下,结果是 S3 类 "eigen"

如果 r <- eigen(A)V <- r$vectors; lam <- r$values ,则

(直到数值模糊),其中 diag(lam)

例子

eigen(cbind(c(1,-1), c(-1,1)))
eigen(cbind(c(1,-1), c(-1,1)), symmetric = FALSE)
# same (different algorithm).

eigen(cbind(1, c(1,-1)), only.values = TRUE)
eigen(cbind(-1, 2:1)) # complex values
eigen(print(cbind(c(0, 1i), c(-1i, 0)))) # Hermite ==> real Eigenvalues
## 3 x 3:
eigen(cbind( 1, 3:1, 1:3))
eigen(cbind(-1, c(1:2,0), 0:2)) # complex values

来源

eigen 使用 LAPACK 例程 DSYEVRDGEEVZHEEVZGEEV

LAPACK 来自https://netlib.org/lapack/,其指南在参考文献中列出。

参考

Anderson. E. and ten others (1999) LAPACK Users' Guide. Third Edition. SIAM.
Available on-line at https://netlib.org/lapack/lug/lapack_lug.html.

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

Wilkinson, J. H. (1965) The Algebraic Eigenvalue Problem. Clarendon Press, Oxford.

也可以看看

svdeigen 的泛化; qrchol 进行相关分解。

要计算矩阵的行列式,qr 分解效率更高:det

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Spectral Decomposition of a Matrix。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。