Nob*_*ody 2 fortran transformation visual-studio qr-decomposition plato
我有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
Run Code Online (Sandbox Code Playgroud)
我在你的代码中看到三个错误:
1)你忘记了LDA论点dgeqrf,
2)TAU并且WORK必须明确分配,
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
Run Code Online (Sandbox Code Playgroud)
在某些情况下,Fortran会执行数组的自动分配,但通常不应该依赖它,并且在这里不是这种情况.
roygvib指出了EDIT Point 3,见下文.
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |