我正在尝试使用适当的lapack例程查找实对称三对角矩阵的第一个(最小)k个特征值。 我对Fortran和lapack库都是陌生的,但是(d)stemr 对我来说似乎是个不错的选择,所以我尝试调用它,但不断出现分段错误。
经过一些试验后,我发现问题出在我的输入矩阵上,
- 对角线= 2 *(1 + 1e-5至1e-3级小变量校正)
- 对角对角线均等于-1(如果我使用例如0.95,则一切正常)
我将代码缩减为单个M(not)WE程序,如下所示。
所以问题是:
-
为什么为什么termer无法使用这样的矩阵,而例如史蒂夫作品?
- 为什么会出现细分错误?
program mwe
implicit none
integer,parameter :: n = 10
integer,parameter :: iu = 3
integer :: k
double precision :: d(n),e(n)
double precision :: vals(n),vecs(n,iu)
integer :: m,ldz,nzc,lwk,liwk,info
integer,allocatable :: isuppz(:),iwk(:)
double precision,allocatable :: wk(:)
do k = 1,n
d(k) = +2d0 + ((k-5.5d0)*1d-2)**2
e(k) = -1d0 ! e(n) not really needed
end do
ldz = n
nzc = iu
allocate(wk(1),iwk(1),isuppz(2*iu))
! ifort -mkl gives SIGSEGV at this call <----------------
call dstemr( &
'V','I',n,d,e,0d0,1,iu,&
m,vals,vecs,-1,isuppz,.true.,&
wk,iwk,info)
lwk = ceiling(wk(1)); deallocate(wk); allocate(wk(lwk))
liwk = iwk(1); deallocate(iwk); allocate(iwk(liwk))
print *,info,liwk ! ok with gfortran
! gfortran -llapack gives SIGSEGV at this call <---------
call dstemr( &
'V',info)
end program
通过以下方式调用编译器:
- gfortran [(GCC)9.2.0]:
gfortran -llapack -o o.x mwe.f90
- ifort [(IFORT)19.0.5.281 20190815]:
ifort -mkl -o o.x mwe.f90