使用Lapack命令“zgetrf”时fortran出错

时间:2013-08-16 16:43:20

标签: fortran lapack

我是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退出状态

我不确定这意味着什么或如何解决它。

谢谢

1 个答案:

答案 0 :(得分:1)

由@ M.S.B发出信号。正确编译代码的第一步是链接lapack。我使用了gfortran main.f90 -o main -llapack -lm并且编译得很好。

此外,要获得正确的决定因素,必须将detsgn初始化为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