我想知道是否有可能在R中仅通过对角线向量对角化对称三对角矩阵(实数),这样您就可以避免生成完整的矩阵并使用像Lapackdstev
或dsteqr
Lapack这样的优化例程
目前,我知道对于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] 删除。
我来说两句