2014-03-04 47 views
0

我想運行m * n個矩陣做QR分解FORTRAN正確的變量定義FORTRAN程序

PROGRAM SUBDEM 
    INTEGER key, n, m, loopA 
    REAL resq 
    REAL A(3,2)  
    REAL B(3) 
    REAL X(2) 
    key = 0 
    n = 2 
    m = 3 
    resq = 0 
    CALL QR(m, n, A, B, X, resq) 
END 

的QR例程是:

subroutine QR(m, n, a, b, x, resq) 
    implicit double precision (a-h, o-z)        
     dimension a(m,n),b(m),x(n) 
     double precision sum, dot 
     resq=-2.0 
     if (m .lt. n) then 
     return 
     endif 
     resq=-1.0 
! Loop ending on 1800 rotates a into upper triangular form. 
     do 1800 j=1, n 
! Find constants for rotation and diagonal entry. 
     sq=0.0 
     do 1100 i=j, m 
      sq=a(i,j)**2 + sq 
1100 continue 
     if (sq .eq. 0.0) then 
      return 
     endif 
     qv1=-sign(sqrt(sq), a(j,j)) 
     u1=a(j,j) - qv1 
     a(j,j)=qv1 
     j1=j + 1 
! Rotate remaining columns of sub-matrix. 
     do 1400 jj=j1, n 
      dot=u1*a(j,jj) 
      do 1200 i=j1, m 
      dot=a(i,jj)*a(i,j) + dot 
1200  continue 
      const=dot/abs(qv1*u1) 
      do 1300 i=j1, m 
      a(i,jj)=a(i,jj) - const*a(i,j) 
1300  continue 
      a(j,jj)=a(j,jj) - const*u1 
1400 continue 
! Rotate b vector. 
     dot=u1*b(j) 
     do 1600 i=j1, m 
      dot=b(i)*a(i,j) + dot 
1600 continue 
     const=dot/abs(qv1*u1) 
     b(j)=b(j) - const*u1 
     do 1700 i=j1, m 
      b(i)=b(i) - const*a(i,j) 
1700 continue 
1800 continue 
! Solve triangular system by back-substitution. 
     do 2200 ii=1, n 
     i=n-ii+1 
     sum=b(i) 
     do 2100 j=i+1, n 
      sum=sum - a(i,j)*x(j) 
2100 continue 
     if (a(i,i).eq. 0.0) then 
      return 
     endif 
     x(i)=sum/a(i,i) 
2200 continue 
! Find residual in overdetermined case. 
     resq=0.0 
     do 2300 i=n+1, m 
     resq=b(i)**2 + resq 
2300 continue 
     return 
     end subroutine 

但是我得到:

錯誤1錯誤#6633:實際參數的類型與僞參數的 類型不同。 [A]錯誤2錯誤#6633: 實際參數的類型與僞參數的類型不同。
[B]錯誤3錯誤#6633:實際參數的類型與僞參數的類型不同 。 [X]錯誤4錯誤#6633:實際參數的 類型與虛擬 參數的類型不同。 [RESQ]

我在做什麼錯?

+4

你已經聲明瞭a,b,x和resq真實的主要和(隱式)在子例程中的雙精度。 – agentp

+3

IMO,應該強烈避免任何'隱式'以外的使用。相反,強烈推薦'implicit none'。 –

回答

4

我將總結@george和@ M.S.B的評論。

過程的僞參數的類型和種類必須與調用代碼使用的實際參數相匹配。例如,當過程位於模塊中時,編譯器可以檢查這種情況,並且某些編譯器也可以爲外部過程執行此操作,這是您的情況。

將子程序放入模塊中是在所有條件和所有編譯器中進行檢查的首選方法。

通過使用implicit double precision (a-h, o-z)您聲明所有名稱以a-ho-z開頭的變量爲double precision。在您的主程序中,您使用real來調用該程序。這是錯誤,類型必須匹配。

除了implicit none之外,我們強烈建議您使用任何其他格式的implicit,這是在每個編譯單元(程序,模塊,外部過程)開始時應該出現的格式。

相關問題