获取与Julia中的p个最大特征值相对应的特征向量

时间:2018-08-20 20:55:56

标签: julia eigenvalue eigenvector

我查看了eigvecseigen,但是它们都不按照特征值的大小对特征向量进行排序。这是我们必须自己编写的东西吗?

testM=diagm(0=>[1,3,2])
eigvals(testM)
eigvecs(testM)
U=eigen(testM)
U.vectors
U.values

2 个答案:

答案 0 :(得分:5)

原来的答案是使用eigfact。但是,从v1.0起,它已重命名为eigen,并移至标准库软件包LinearAlgebra,因此在代码顶部需要一个using LinearAlgebra。完成此操作后,您可以使用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(Symmetric(x), K-k+1:K) #k largest eigenvalues/vectors
ef.values
ef.vectors
reverse(ef.values, dims=1)    #If you want ordered largest to smallest
reverse(ef.vectors, dims=2)   #If you want ordered largest to smallest

对于非对称输入,您需要计算所有特征值/向量,然后获取所需的任何切片。输出仍然排序,所以:

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

和以前一样,如果要从大到小订购最大的reverse,请使用k

答案 1 :(得分:2)

科林的答案很好。我要补充一点,还有一个软件包Arpack.jl,它提供了对ARPACK Fortran库的绑定。导出的方法eigs还具有选项nev,用于指定请求的特征值/向量的数量。