使用Lapack命令时fortran出错;ZGETF“是的;
我是拉帕克的新手,我试图找到NxN矩阵的行列式。我使用了dualm.wordpress.com/2012/01/06/computing-determinate-in-fortran中的代码/使用Lapack命令时fortran出错;ZGETF“是的;,fortran,lapack,Fortran,Lapack,我是拉帕克的新手,我试图找到NxN矩阵的行列式。我使用了dualm.wordpress.com/2012/01/06/computing-determinate-in-fortran中的代码/ program lapackdet implicit none integer :: N complex, allocatable, dimension(:,:) :: mat complex :: det integer :: i, info integer, allocata
program lapackdet
implicit none
integer :: N
complex, allocatable, dimension(:,:) :: mat
complex :: det
integer :: i, info
integer, allocatable :: ipiv(:)
real :: sgn
N=2
allocate(ipiv(N))
allocate(mat(N,N))
mat=2
mat(1,2)=1
mat(2,1)=1
ipiv=0
call zgetrf(N, N, mat, N, ipiv, info)
do i=1, N
det = det*mat(i,i)
end do
do i=1, N
if(ipiv(i)/=i)then
sgn=-sgn
end if
end do
det=sgn*det
write(*,*) det
end program lapackdet
使用此代码时,会出现以下错误:
“zgetrf”,引用自:
cc8VZrbU.o中的数据
ld:找不到符号
collect2:ld返回了1个退出状态
我不知道这意味着什么,也不知道如何修复它
感谢@M.S.B.发出的信号。正确编译代码的第一步是链接
lapack
。我使用了gfortran main.f90-o main-llapack-lm
,它编译得很好
此外,要获得正确的行列式,det
和sgn
必须初始化为1,如@KileKanos所示。LAPACK库的例程需要复数*16
:每个复数的实部和虚部都是双精度的
最后,这里是一个计算复杂矩阵行列式的工作代码。它是用gfortran main.f90-o main-llapack-lm
编译的:
program lapackdet
implicit none
integer :: N
COMPLEX*16, allocatable, dimension(:,:) :: mat
COMPLEX*16 :: det
integer :: i, info
integer, allocatable :: ipiv(:)
real :: sgn
N=2
allocate(ipiv(N))
allocate(mat(N,N))
mat(1,2)=1
mat(2,1)=1
mat(1,1)=0
mat(2,2)=0
ipiv=0
call zgetrf(N, N, mat, N, ipiv, info)
det=1
do i=1, N
det = det*mat(i,i)
end do
sgn=1
do i=1, N
if(ipiv(i)/=i)then
sgn=-sgn
end if
end do
det=sgn*det
write(*,*) det
end program lapackdet
错误消息表示链接器没有找到从源代码调用的子例程
zgetrf
。是否在link命令中包含Lapack库?请注意,det
未初始化为1。