如何使R的eigen()返回非降序特征值?有无替代R包?
R中获取无特定顺序的矩阵特征值
原生eigen()函数的限制
R原生的eigen()函数没有参数可以直接控制特征值的排序逻辑,它默认会将特征值按降序(从大到小)排列,就像你给出的示例结果:
covMat <- var(cbind(A,B,C)) evals <- eigen(covMat)$values evals # [1] 0.43162433 0.10861830 0.06010923
无法直接通过eigen()获取无固定顺序的特征值。
简单替代:手动打乱顺序
如果只是需要无特定顺序的特征值结果,最直接的方式是对eigen()返回的结果做随机打乱:
set.seed(123) # 设置随机种子保证结果可复现 shuffled_evals <- sample(eigen(covMat)$values) shuffled_evals # [1] 0.10861830 0.43162433 0.06010923
其他R包的选择
如果需要从计算底层避免排序,可以尝试以下包:
- RSpectra包:它的
eigs()函数主要用于稀疏矩阵的特征值计算,当指定计算全部特征值时,返回的结果顺序由算法实现决定,并非刻意排序。示例代码:
library(RSpectra) # 计算矩阵全部特征值,顺序由算法决定 evals_unsorted <- eigs(covMat, k = ncol(covMat), which = "LM")$values
- Matrix包:针对稀疏矩阵的
eigen()方法,返回的特征值顺序同样取决于底层计算逻辑,不会像基础包那样强制降序排列。
内容的提问来源于stack exchange,提问作者Sara Soria
相关产品推荐
相关产品推荐

