使用SGETR(F,I)的Fortran逆矩阵计算只能在单精度下工作

使用SGETR(F,I)的Fortran逆矩阵计算只能在单精度下工作,fortran,fortran90,lapack,matrix-inverse,fortran95,Fortran,Fortran90,Lapack,Matrix Inverse,Fortran95,我试图计算平方矩阵的逆矩阵,但它不起作用。我查看了以前的帖子,但逻辑是一样的,但我仍然没有发现问题出在哪里。我还分享了Matlab的结果,例如矩阵 program test Implicit none real,allocatable,dimension(:,:) :: A real,allocatable,dimension(:) :: WORK integer ,allocatable,dimension(:) :: ipiv

我试图计算平方矩阵的逆矩阵,但它不起作用。我查看了以前的帖子,但逻辑是一样的,但我仍然没有发现问题出在哪里。我还分享了Matlab的结果,例如矩阵

program test

Implicit none

real,allocatable,dimension(:,:)         :: A       
real,allocatable,dimension(:)           :: WORK
integer ,allocatable,dimension(:)       :: ipiv
integer                                 :: n,info,M
external     SGETRF,SGETRI
M=8
allocate(A(M,M),WORK(M),IPIV(M))

A(1,:)=(/3.74E-4, 0.0, 0.0, 4.98E-5, 0.0, 0.0, 0.0, 0.0/)
A(2,:)=(/0.0 , 3.74E-4, 0.0, 0.0, 4.98E-5 ,0.0 ,0.0 ,0.0 /)
A(3,:)=(/0.0 , 0.0 ,3.74E-4, 0.0 ,0.0, 4.98E-5, 0.0 ,0.0/)
A(4,:)=(/4.98E-5 ,0.0 ,0.0 ,6.64e-6, 0.0 ,0.0, 0.0, 0.0 /)
A(5,:)=(/0.0 , 4.98E-5, 0.0, 0.0 ,6.64E-6 ,0.0 ,0.0 ,0.0 /)
A(6,:)=(/0.0, 0.0, 4.98E-5, 0.0 ,0.0, 6.64E-6, 0.0 ,0.0 /)
A(7,:)=(/0.0, 0.0 ,0.0, 0.0 ,0.0 ,0.0 ,1.49E-11, 0.0 /)
A(8,:)=(/0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0, 0.0 ,1.49E-11 /)


call SGETRF(M,M,A,M,IPIV,info)
if(info .eq. 0) then
   Print *,'succeded'
else
   Print *,'failed'
end if

call SGETRI(M,A,M,IPIV,WORK,M,info)
if(info .eq. 0) then
  Print *,'succeded'
else
  Print *,'failed'
end if
Print *,A

deallocate(A,IPIV,WORK)

end 

!!!!! Matlab Result
!1.0e+10 *
! 0.0002     0       0   -0.0015       0      0        0   0
!     0      0.0002  0       0       -0.0015  0        0   0
!     0      0    0.0002     0         0     -0.0015   0   0
! -0.0015    0       0     0.0113      0      0        0   0
!     0     -0.0015  0       0       0.0113   0        0   0
!     0      0   -0.0015     0         0    0.0113     0   0
!     0      0       0       0         0      0     6.7114 0
!     0      0       0       0         0      0        0   6.7114

您的
real
仅为单精度。lapack
D
前缀表示双精度。两个修正:

  • 将您的
    DG
    s更改为
    SG
    s
  • 保持您的
    DG
    s并使用双精度

  • 您的
    real
    仅为单精度。lapack
    D
    前缀表示双精度。两个修正:

  • 将您的
    DG
    s更改为
    SG
    s
  • 保持您的
    DG
    s并使用双精度

  • 我更改为双精度,但结果不正确,但单精度正在工作!根据新的问题标题,似乎您正试图使用双精度数据调用单精度lapack例程。这是正确的吗?这种情况对于矩阵是病态的。它也可以实现双精度,但结果有点奇怪。逆矩阵之后,我将用cholesky分解矩阵。但如果我这样做,矩阵是奇异的,而不是非奇异的。我更改为双精度,但结果不正确,但单精度有效!根据新的问题标题,似乎您正试图使用双精度数据调用单精度lapack例程。这是正确的吗?这种情况对于矩阵是病态的。它也可以实现双精度,但结果有点奇怪。在逆矩阵之后,我将通过cholesky分解来分解矩阵。但是如果我这样做,矩阵是奇异的,而不是非奇异的。请保持原样,因为它现在已经有了一个公认的答案。不要用新问题重写代码,因为你现在有了新问题。保留在新问题中。请保留问题原样,因为它现在有一个可接受的答案。不要用新问题重写代码,因为你现在有了新问题。保留在新问题中。