得到Julia中p个最大特征值对应的特征向量
我研究了得到Julia中p个最大特征值对应的特征向量,julia,eigenvalue,eigenvector,Julia,Eigenvalue,Eigenvector,我研究了eigvecs和eigen,但它们都没有按照特征值的大小对特征向量进行排序。这是我们必须自己编写的代码吗 testM=diagm(0=>[1,3,2]) eigvals(testM) eigvecs(testM) U=eigen(testM) U.vectors U.values 旧的答案是使用eigfact。但是,从v1.0开始,它已重命名为eigen,并移动到标准库包linearagebra,因此您需要在代码顶部使用linearagebra。完成此操作后,您可以使用?eige
eigvecs
和eigen
,但它们都没有按照特征值的大小对特征向量进行排序。这是我们必须自己编写的代码吗
testM=diagm(0=>[1,3,2])
eigvals(testM)
eigvecs(testM)
U=eigen(testM)
U.vectors
U.values
旧的答案是使用
eigfact
。但是,从v1.0开始,它已重命名为eigen
,并移动到标准库包linearagebra
,因此您需要在代码顶部使用linearagebra。完成此操作后,您可以使用?eigen
查看eigen
的文档。注意,我还更新了此答案,将flipdim
替换为reverse
(另一个v1.0版本更改)
对于对称输入,您可以选择传入UnitRange{Int}
,以获得与k
最小或最大特征值对应的特征向量:
ef = eigen(Symmetric(x), 1:k) #k smallest eigenvalues/vectors
ef.values
ef.vectors
或
对于非对称输入,您需要计算所有特征值/向量,然后获取您想要的任何切片。输出仍处于排序状态,因此:
K = size(x, 1)
ef = eigen(x)
ef.values[1:k] #smallest k
ef.vectors[:, 1:k] #smallest k
ef.values[K-k+1:K] #largest k
ef.vectors[:, K-k+1:K] #largest k
如前所述,如果您想将最大的
k
从大到小排序,请使用reverse
。科林的答案很好。让我补充一点,还有一个包提供了到Fortran库的绑定。导出的方法eigs
也有一个选项nev
来指定请求的特征值/向量的数量。U.vectors[:,sortperm(U.values)。>1]
我认为,当您想要选择除与最小特征值对应的特征向量以外的所有向量时,该选项都有效。所以我的问题是,有没有更好的办法?我的意思是这一直是编程的问题。很容易找到一个蹩脚的方法。也许你应该提到,在Julia>=0.7eigfact
中,它已被移动到LinearAlgebra
stdlib。@crstnbr oops同意,绝对值得一提。我不打电话的时候会修好的。干杯。我在Julia 1.0.0的文档中找不到eigfact
?@ztyh是的,正如crstnbr所指出的,在v0.7+中,eigfact
已移动到标准库包LinearAlgebra
。因此,只需在代码前面加上和linearagebra
,然后?eigfact
就会显示文档。我已经调整了我的答案以反映这一点。(我仍然习惯于v0.7+中新的标准库包结构)@ztyh Oops刚刚意识到,eigfact
现在也被重命名为eigen
。现在调整答案。
K = size(x, 1)
ef = eigen(x)
ef.values[1:k] #smallest k
ef.vectors[:, 1:k] #smallest k
ef.values[K-k+1:K] #largest k
ef.vectors[:, K-k+1:K] #largest k