获取 Julia 中 p 个最大特征值对应的特征向量
Get eigenvectors corresponding to the p largest eigenvalues in Julia
我查看了 eigvecs
和 eigen
,但它们都没有根据特征值的大小对特征向量进行排序。这是我们必须自己编写代码的东西吗?
testM=diagm(0=>[1,3,2])
eigvals(testM)
eigvecs(testM)
U=eigen(testM)
U.vectors
U.values
旧答案是使用 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
对于非对称输入,你需要计算所有 eigenvalues/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
。
Colin 的回答很棒。让我补充一点,还有包 Arpack.jl which provides bindings to the ARPACK Fortran 库。导出的方法 eigs
还有一个选项 nev
来指定请求的数量 eigenvalues/vectors.
我查看了 eigvecs
和 eigen
,但它们都没有根据特征值的大小对特征向量进行排序。这是我们必须自己编写代码的东西吗?
testM=diagm(0=>[1,3,2])
eigvals(testM)
eigvecs(testM)
U=eigen(testM)
U.vectors
U.values
旧答案是使用 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
对于非对称输入,你需要计算所有 eigenvalues/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
。
Colin 的回答很棒。让我补充一点,还有包 Arpack.jl which provides bindings to the ARPACK Fortran 库。导出的方法 eigs
还有一个选项 nev
来指定请求的数量 eigenvalues/vectors.