LAPACK - DGETRF 失败(反转矩阵)
LAPACK - DGETRF fails (inverting matrices)
我正在尝试计算矩阵的逆,但 DGETRF 一直说矩阵是数值奇异的,即使矩阵不是。
real :: testM(1:2, 1:2), workT(2)
integer :: ipivT(2), info
testM = reshape((/4,2,7,6/), shape(testM))
WRITE(*,*) "started matrix inversion"
! DGETRF computes an LU factorization of a general M-by-N matrix A
! using partial pivoting with row interchanges.
call DGETRF(2, 2, testM, 2, ipivT, info)
WRITE(*,*) "info = ", info
if (info /= 0) then
stop 'Matrix is numerically singular!'
end if
! DGETRI computes the inverse of a matrix using the LU factorization
! computed by DGETRF.
call DGETRI(2, testM, 2, ipivT, workT, 2, info)
if (info /= 0) then
stop 'Matrix inversion failed!'
end if
WRITE(*,*) testM
WRITE(*,*) "Matrix success"
我收到一条错误消息,指出矩阵在数值上是奇异的 (info = 2)。
但是矩阵在数值上不是奇异的,我不知道为什么会给出错误。
最后我想将代码缩放到 (33,33) 矩阵。但我首先尝试让它为这个 (2,2) 矩阵工作。
dgetrf (http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga0019443faea08275ca60a734d0593e60.html) 的文档说:
subroutine dgetrf ( integer M,
integer N,
double precision, dimension( lda, * ) A,
integer LDA,
integer, dimension( * ) IPIV,
integer INFO
)
所以一个 double precision
变量 A
但是你用 real
变量调用例程 testM
.
DGETRI
.
可能会出现类似的问题
我正在尝试计算矩阵的逆,但 DGETRF 一直说矩阵是数值奇异的,即使矩阵不是。
real :: testM(1:2, 1:2), workT(2)
integer :: ipivT(2), info
testM = reshape((/4,2,7,6/), shape(testM))
WRITE(*,*) "started matrix inversion"
! DGETRF computes an LU factorization of a general M-by-N matrix A
! using partial pivoting with row interchanges.
call DGETRF(2, 2, testM, 2, ipivT, info)
WRITE(*,*) "info = ", info
if (info /= 0) then
stop 'Matrix is numerically singular!'
end if
! DGETRI computes the inverse of a matrix using the LU factorization
! computed by DGETRF.
call DGETRI(2, testM, 2, ipivT, workT, 2, info)
if (info /= 0) then
stop 'Matrix inversion failed!'
end if
WRITE(*,*) testM
WRITE(*,*) "Matrix success"
我收到一条错误消息,指出矩阵在数值上是奇异的 (info = 2)。 但是矩阵在数值上不是奇异的,我不知道为什么会给出错误。
最后我想将代码缩放到 (33,33) 矩阵。但我首先尝试让它为这个 (2,2) 矩阵工作。
dgetrf (http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga0019443faea08275ca60a734d0593e60.html) 的文档说:
subroutine dgetrf ( integer M,
integer N,
double precision, dimension( lda, * ) A,
integer LDA,
integer, dimension( * ) IPIV,
integer INFO
)
所以一个 double precision
变量 A
但是你用 real
变量调用例程 testM
.
DGETRI
.