2

我是 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 ”,引用自: det in cc8VZrbU.o ld:未找到符号 collect2:ld 返回 1 退出状态

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

谢谢

4

1 回答 1

1

正如@MSB 所暗示的,正确编译代码的第一步是链接lapack. 我用过gfortran main.f90 -o main -llapack -lm,它编译得很好。

此外,要获得正确的行列式,det必须sgn将其初始化为 1,如 @KileKanos 所示。zgetrf而LAPACK库的例程需要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
于 2015-02-20T14:26:36.027 回答