2016-11-22 349 views
0

我想从DSYEV中找到最小的特征值,我不确定我想要放入DSYEV的代码中。(Fortran)如何使用lapack中的DSYEV来计算(方形)矩阵的特征值?

说我的矩阵A是45x45,我想找到它的特征值。到目前为止,我有:

subroutine eigenvalues() 
implicit none 
real(kind=8),allocatable,dimension(:,:)::A 
real(kind=8),allocatable,dimension(:)::WORK, W 
integer, allocatable, dimension(:)::t 
integer::info,k,Z 
t = shape(A) 
k = t(1) 
allocate(W(k)) 
print *, shape(M) 
Z = 3*k-1 
call dsyev('N','U',k,M,k,W,WORK,Z,info) 
end subroutine eigenvalues 

我真的不知道什么是选择存储上三角矩阵两种意思。我不知道LWORK从文档中意味着什么。

+0

@HighPerformanceMark已更改此零件。然而它出现了分割错误。我还添加了一个例子。 –

+0

你正在调用你的cholesky,并且没有初始化M矩阵 –

回答

0
  1. 你要计算的A特征值但M
  2. 您声明打电话给你dsyev,但不分配A
  3. 你没有申报,界定或分配M

在哪里你的矩阵是从哪里来的?如果你在其他地方计算它们,你可能必须将它们传递给你的子程序。那么你还需要传递尺寸。

subroutine eigenvalues(A,k,k,eigvalues) 

!calling list 
integer, intent(in)    :: k 
double precision, intent(inout) :: A(k,k), eigvalues(k) 

!local 
double precision,allocatable :: work(:) 
integer      :: lwork,info 

lwork = max(1,3*k-1) 
allocate(work(lwork)) 


call dsyev('N','U',k,A,k,eigvalues,WORK,LWORK,info) 
if(info .neq. 0) exit 

就像这样(不完整的例子)。

您需要分配你的特征值向量在调用程序藏汉,我确定你需要的任何特征值...

工作和LWORK并不真正需要关心你。关于Upper和Lower,请看你的dsyev调用之前和之后的矩阵A ...

相关问题