2017-03-14 8 views
0

R에서 간단한 Fortran 서브 루틴을 호출하려고했지만 잘못된 것이 있습니다. 나는 포트란 코드를 컴파일했다. (정확히 말하면이 언어에서는 초보자이다.)하지만 R은 서브 루틴을 호출 할 때 실패한다.R에서 Fortran 서브 루틴을 호출 할 수 없음

포트란 코드는 a의 값을 계산하는 간단한 서브 루틴이다. (정의 된) 범위의 각 지점에서의 속성. 결과는 크기 2 x 100 000의 행렬 (포트란의 배열)에 저장됩니다. 한 행은 함수 f (x)의 값을 저장하고 다른 행은 해당 변수 (x)를 저장합니다.

Subroutine algo(n, tho, c, phi, ydata, eps, results) 

    ! n : number of observations 
    ! tho : number of steps in the range 
    ! phi and c are given parameters 
    ! ydata : the vector of data 
    ! eps : the iteration step 
    ! results : array which stores the results 

    IMPLICIT NONE 

    INTEGER         :: n, i, j, tho 
    DOUBLE PRECISION      :: c, phi, sigma2, eps, ll 
    DOUBLE PRECISION, DIMENSION(1:n)  :: ydata 
    DOUBLE PRECISION, DIMENSION(1:tho)  :: vecteps 
    DOUBLE PRECISION, DIMENSION(1:2,1:tho) :: results 
    DOUBLE PRECISION, PARAMETER    :: pi=acos(-1.d0) 

    ! vecteps is the vector of all the x 
    vecteps(1)=0 

    do i=1,tho 
     vecteps(i)=vecteps(i)+eps 
    end do 

    do j=1,tho 
     sigma2=vecteps(j) 

     ll=-((-(n-1)/2)*log(2*pi)-((n-1)/2)*log(sigma2)- 
     sum((ydata(2:n)-c-phi*ydata(1:n-1))**2)/(2*sigma2)) 

     results(1,j)=ll 
     results(2,j)=vecteps(j) 
    end do 

end subroutine algo 

그런 다음 배열의 1,000 관찰 "결과"그 R이 숫자가 몇 NaN의 모든 같은 대다수이며, 제공에서 R

y=rnorm(200,0,1) 
y[1]=4/(1-0.6) 
for(i in 2:length(y)){ 
    y[i]=4+0.6*y[i-1]+rnorm(1,0,1) 
} 

results=matrix(0, nrow=2, ncol=100000) 

dyn.load("algo.dll") 
    .Fortran('algo',n=as.integer(200), tho=as.integer(100000), c=as.double(4), phi=as.double(0.6), ydata=as.double(y), eps=as.double(0.0001), results=as.double(results)) 

에서 통화 :

$results 
    [1] 8.921136e+05 1.000000e-04 8.921136e+05 1.000000e-04 8.921136e+05 1.000000e-04 
    [7] 8.921136e+05 1.000000e-04 8.921136e+05 1.000000e-04 8.921136e+05 1.000000e-04 
    [13]   NaN   NaN 8.921136e+05 1.000000e-04 8.921136e+05 1.000000e-04 

I 그가 내게 [1] F (X1) 0.0001 F (X2) 0.0002 갖는 출력을 제공한다는 싶습니다 ...

나에게 번째 전자의 문제는 3 가지 문제

에서 올 수 포트란 코드에서
  • 잘못된 수학
  • 매트릭스를 잘못 사용/배열
  • R (.Fortran (...에서 서브 루틴 호출, 같은 N =
      ...))

    그러나 나는 그것을 풀지 못한다. 어떤 도움이라도 대단히 감사하겠습니다. 감사!

  • +0

    결과에서 더 명확하게하기 위해 초기 게시물을 편집했습니다. –

    +1

    나는 이것을 조사 할 컴퓨터가 없었지만, 첫 번째 루프에서'vecteps (i) = vecteps (i) + eps'는 매우 의심 스럽습니다. 그 점에 대해서'vecteps (1)'만 정의되었습니다. 아마도 나중에 vecteps = 0 (또는 vecteps (:) = 0')을 의미 할 것입니다. – francescalus

    +0

    이 루프로 나는이 R 코드에 의해 생성 된 벡터와 비슷한 벡터를 생성하려고합니다. "vecteps = seq (from = 0.0001, to = 10, by = 0.0001)"...하지만 당신은 맞습니다. 여기에서 실패한 것 같습니다. –

    답변

    0

    당신은 inline 패키지를 사용할 수 있습니다 - 여기에 최초의 예는 다음과 같습니다

    R> x <- as.numeric(1:10) 
    R> n <- as.integer(10) 
    R> code <- " 
    +  integer i 
    +  do 1 i=1, n(1) 
    +  1 x(i) = x(i)**3 
    + " 
    R> cubefn <- cfunction(signature(n="integer", x="numeric"), code, 
    +      convention=".Fortran") 
    R> print(cubefn) 
    An object of class 'CFunc' 
    function (n, x) 
    .Primitive(".Fortran")(<pointer: 0x7fc8a8db7660>, n = as.integer(n), 
        x = as.double(x)) 
    <environment: 0x8193e98> 
    code: 
        1: 
        2:  SUBROUTINE file2e6b876b50a29 (n, x) 
        3:  INTEGER n(*) 
        4:  DOUBLE PRECISION x(*) 
        5: 
        6:  integer i 
        7:  do 1 i=1, n(1) 
        8:  1 x(i) = x(i)**3 
        9: 
    10:  RETURN 
    11:  END 
    12: 
    R> cubefn(n, x)$x 
    [1] 1 8 27 64 125 216 343 512 729 1000 
    R> 
    

    내가 코드 빌드 및 실행, 그리고이 달성되면, 패키지를 작성하는 것이 좋습니다 있는지 확인하려면이 옵션을 사용합니다.