像在Lapack Dstev中一样,从R中的三对角对称矩阵获取特征值

罗卡斯托克

我想知道是否有可能在R中仅通过对角线向量对角化对称三对角矩阵(实数),这样您就可以避免生成完整的矩阵并使用像LapackdstevdsteqrLapack这样的优化例程

目前,我知道对于R函数,eigen您只需指定矩阵是否对称即可。

为了获得良好的性能,是否值得尝试直接访问lapack或只是针对这种特殊情况使用手动算法?

罗卡斯托克

经过一些研究和反复试验,我自己找到了解决此问题的方法。

有一些本地方法可以在R和例程中调用外部代码,.Fortran并且.C可以从这些语言执行已编译的代码,而无需中间层。

以下代码说明了如何使用LAPACK例程dstev,以便根据对称矩阵计算特征值和特征向量。为此,必须在计算机上安装BLAS / LAPACK实施,例如Atlas,OpenBLAS或MKL。

dyn.load("/usr/lib/liblapack.so")  #Load Lapack
Jobz <- as.character('V')            #Get The eigenvalues and Eigenvectors
N <- as.integer(10)                  #Matrix Dimension
D <- runif(10)                       #Diagonal
E <- runif(9)                        #Upper (and lower) diagonal
Z <- array(0.0,N*N)                  #storage for eigenvectors
Ldz <- N                             #Leading dimension of Z (in our case number of rows)
Work <- array(0.0,2*N)               #Storage for processing
info <- as.integer(0)                #Info flag

#Call the fortran routine
res<-.Fortran("dstev", Jobz, N, D, E, Z, Ldz, Work, info)

#Extract the information
evalues <- res[[3]]
evectors <- matrix(res[[5]],N,N)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章