得到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.7
eigfact
中,它已被移动到
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