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 가지 문제
에서 올 수 포트란 코드에서-
...))
그러나 나는 그것을 풀지 못한다. 어떤 도움이라도 대단히 감사하겠습니다. 감사!
결과에서 더 명확하게하기 위해 초기 게시물을 편집했습니다. –
나는 이것을 조사 할 컴퓨터가 없었지만, 첫 번째 루프에서'vecteps (i) = vecteps (i) + eps'는 매우 의심 스럽습니다. 그 점에 대해서'vecteps (1)'만 정의되었습니다. 아마도 나중에 vecteps = 0 (또는 vecteps (:) = 0')을 의미 할 것입니다. – francescalus
이 루프로 나는이 R 코드에 의해 생성 된 벡터와 비슷한 벡터를 생성하려고합니다. "vecteps = seq (from = 0.0001, to = 10, by = 0.0001)"...하지만 당신은 맞습니다. 여기에서 실패한 것 같습니다. –