我想知道是否可以在R 中对称化对称三对角矩阵(真实),仅通过对角矢量,这样就可以避免生成完整矩阵并使用优化的例程{{1来自Lapack的{}或dstev
到目前为止,我知道对于R函数dsteqr
,您只需指定矩阵是否对称。
为了获得良好的性能,是否值得尝试直接访问lapack或只为这种特殊情况做手动算法?
答案 0 :(得分:0)
经过一些研究和反复试验,我自己找到了解决这个问题的方法。
在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)