【发布时间】:2018-08-30 18:48:54
【问题描述】:
我正在尝试使用 Fortran 和 lapack 查找 nxn Hermitian 矩阵的逆函数和特征函数。
如何为lda、lwork、liwork 和lrwork 等参数选择最佳值。我浏览了一些示例并找到了这些选择
integer,parameter::lda=nh
integer,parameter::lwork=2*nh+nh*nh
integer,parameter::liwork=3+5*nh
integer,parameter::lrwork=1 + 5*nh + 2*nh*nh
其中nh 是矩阵的维度。我还找到了lwork=16*nh 的另一个例子。如何确定最佳选择?此时,我正在处理 500x500 Hermitian 矩阵(最大)。
我找到了this documentation,这表明
工作
(工作区)REAL 数组,维度(LWORK)
退出时,如果 INFO = 0,则 WORK(1) 返回最优 LWORK。
工作
(输入)整数
数组WORK的维度。 LWORK  最大(1,N)。
为了获得最佳性能 LWORK  N*NB,其中 NB 是 ILAENV 返回的最佳块大小。
对于给定的矩阵维度,是否可以使用WORK 或ILAENV 找出最佳块大小?
我在 mkl 中同时使用 gfortran 和 ifort。
编辑
根据@percusse 和@kvantour's answer 的评论,这里有一个示例代码
character,parameter::jobz="v",uplo="u"
integer, parameter::nh=15
complex*16::m(nh,nh),m1(nh,nh)
integer,parameter::lda=nh
integer::ipiv(nh),info
complex*16::work(1)
real*8::rwork(1), w(nh)
integer::iwork(1)
real*8::x1(nh,nh),x2(nh,nh)
call random_seed()
call random_number(x1)
call random_number(x2)
m=cmplx(x1,x2)
m1=conjg(m)
m1=transpose(m1)
m=(m+m1)/2.0
call zheevd(jobz,uplo,nh,m,lda,w,work,-1,rwork,-1,iwork, -1,info)
print*,"info : ", info
print*,"lwork: ", int(work(1)) , 2*nh+nh*nh
print*,"lrwork:", int(rwork(1)) , 1 + 5*nh + 2*nh*nh
print*,"liwork:", int(iwork(1)) , 3+5*nh
end
信息:0
工作:255 255
lrwork: 526 526
liwork: 78 78
【问题讨论】:
-
您首先使用
LWORK=-1调用该函数并获得最佳块大小。然后你用这些返回值再次调用函数 -
在非常少数情况下,人们实际上想要计算 500x500 矩阵的逆矩阵。