从R中的三对角对称矩阵获得特征值,如lapack dstev

时间:2014-08-12 06:49:30

标签: r lapack

我想知道是否可以在R 中对称化对称三对角矩阵(真实),仅通过对角矢量,这样就可以避免生成完整矩阵并使用优化的例程{{1来自Lapack的{}或dstev

到目前为止,我知道对于R函数dsteqr,您只需指定矩阵是否对称。

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

1 个答案:

答案 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)