QR 分解 Fortran 错误



我对QR分解方法有问题。我使用 dgeqrf 子例程进行分解,但编译器中没有错误,但之后会出现问题。我还没有找到错误在哪里。 另一个问题是,A=Q*R=>如果 A 矩阵为零,分解是否可以为零或失去秩。

program decomposition
!CONTAINS
!subroutine Qrdecomposition(A_mat, R)
real,dimension(2,2)   :: A_mat    !real,dimension(2,2),intent(inout)   
:: A_mat
real,dimension(2,2)   :: R        !real,dimension(2,2),intent(out)     
:: R
real,dimension(2,2)                  :: A
integer                              :: M,N,LDA,LWORK,INFO
real,allocatable, dimension(:,:)     :: TAU
real,allocatable, dimension(:,:)     :: WORK
external   dgeqrf
M=2
N=2
LDA=2
LWORK=2
INFO=0
A_mat(1,1)=4
A_mat(1,2)=1
A_mat(2,1)=3
A_mat(2,2)=1
A=A_mat
call dgeqrf(M,N,A,TAU,WORK,LWORK,INFO)
R=A
print *,R,WORK,LWORK
!end subroutine Qrdecomposition
end program decomposition

我在你的代码中看到三个错误:

1(你忘记了dgeqrfLDA参数,

2(TAUWORK必须明确分配,

3( 所有数组都应以双精度声明,以与dgeqrf接口保持一致:

program decomposition
!CONTAINS
!subroutine Qrdecomposition(A_mat, R)
! Note: using '8' for the kind parameter is not the best style but I'm doing it here for brevity.
real(8),dimension(2,2)   :: A_mat    !real,dimension(2,2),intent(inout)
real(8),dimension(2,2)   :: R        !real,dimension(2,2),intent(out)
real(8),dimension(2,2)                  :: A
integer                              :: M,N,LDA,LWORK,INFO
real(8),allocatable, dimension(:,:)     :: TAU
real(8),allocatable, dimension(:,:)     :: WORK
external   dgeqrf
M=2
N=2
LDA=2
LWORK=2
INFO=0
A_mat(1,1)=4
A_mat(1,2)=1
A_mat(2,1)=3
A_mat(2,2)=1
A=A_mat
allocate(tau(M,N), work(M,N))
call dgeqrf(M,N,A,LDA,TAU,WORK,LWORK,INFO)
R=A
print *,R,WORK,LWORK
!end subroutine Qrdecomposition
end program decomposition

在某些情况下,Fortran 确实会执行数组的自动分配,但通常不应指望它,这里的情况并非如此。

编辑点3由Roygvib指出,见下文。

最新更新