我是lapack的新手并试图找到NxN矩阵的行列式。我使用了dualm.wordpress.com/2012/01/06/computing-determinant-in-fortran /
中的代码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中的 det ld:找不到符号 collect2:ld返回1退出状态
我不确定这意味着什么或如何解决它。
谢谢
答案 0 :(得分:1)
由@ M.S.B发出信号。正确编译代码的第一步是链接lapack
。我使用了gfortran main.f90 -o main -llapack -lm
并且编译得很好。
此外,要获得正确的决定因素,必须将det
和sgn
初始化为1,如@KileKanos所示。 LAPACK库的例程zgetrf
需要COMPLEX*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