2014-03-04 3 views
0
나는에 QR 분해를 수행하는 m * n 개의 행렬을 실행할

포트란올바른 변수 정의 포트란 루틴

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 real을 서브 루틴에서 기본 및 (암시 적으로) 배정 밀도로 선언했습니다. – agentp

+3

IMO에서는 '암시 적 없음'이 아닌 '암시 적'의 사용을 강력히 피해야합니다. 반대로 '암시 적 없음'을 적극 권장합니다. –

답변

4

@george와 @ M.S.B의 의견을 합산합니다.

프로 시저의 더미 인수의 종류 및 종류는 호출 코드에서 사용하는 실제 인수와 일치해야합니다. 컴파일러는 프로 시저가 모듈에있을 때 명시 적 인터페이스가있을 때이를 확인할 수 있으며, 일부 컴파일러는 외부 프로 시저에 대해이를 수행 할 수 있습니다.

모든 조건 및 모든 컴파일러에서이 검사를 수행하려면 기본 루틴을 모듈에 배치하는 것이 좋습니다.

implicit double precision (a-h, o-z)을 사용하면 으로 시작하는 모든 변수를 a-h 또는 o-z으로 선언합니다. 주 프로그램에서 real을 사용하여 프로 시저를 호출합니다. 이 오류는 유형이 일치해야합니다.

implicit none이 아닌 다른 형태의 implicit을 사용하는 것이 좋습니다.이 형식은 모든 컴파일 단위 (프로그램, 모듈, 외부 절차)의 시작 부분에 있어야합니다.

관련 문제