【问题标题】:QR decomposition Fortran errorQR分解Fortran错误
【发布时间】:2018-05-22 18:37:58
【问题描述】:

我对 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

【问题讨论】:

    标签: visual-studio fortran transformation qr-decomposition plato


    【解决方案1】:

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

    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 指出,见下文。

    【讨论】:

    • 感谢您的帮助 :) 你找到了什么 R(变换矩阵)?
    • 这是它在我的机器上显示的内容:262144.906 -3.0 -6.49038268E+32 0.624999940.
    • 输入数组的种类(实数)和子程序dgeqrf(双精度)是不是不一致? netlib.org/lapack/lapack-3.1.1/html/sgeqrf.f.htmlnetlib.org/lapack/explore-3.1.1-html/dgeqrf.f.html
    • 如果 A=[4 1;3 1],结果应该是 R=[ -5.00 -1.40 ;0.00 0.20]。但是代码 result=[-5 0.33;-1.4 0.2] 有问题,因为 A(2,1) 对于正交变换应该为零
    • 其实你是对的,因为我用的是real但是当我尝试sqeqrf的时候,结果就大不一样了
    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多