2017-03-14 6 views
0

Rから単純なFortranサブルーチンを呼び出そうとしましたが、何かが間違っていました。私はFortranコードをコンパイルすることができましたが(私はこの言語で初心者です)、Rでサブルーチンを呼び出すと失敗します。RからのFortranサブルーチンの呼び出しに失敗しました

Fortranコードは、aの値を計算する単純なサブルーチンです。 (定義された)範囲の各点での特徴。結果は、サイズ2×100 000の行列(Fortranの配列)に格納されます。一方の行には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 

Rが与える配列「結果」の1000回の観測から、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)) 

、数字が大半のため、いくつかのNaNとすべて同じです。

$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 

私は、彼が私に私に[1] F(X1)0.0001 F(×2)0.0002 ...

で出力を与えることを目をしたいと思いますEの問題は、3つの異なる問題

    からFortranコード
  • マトリックス/アレイの不適切な使用
  • R(.Fortran(...、N =などからサブルーチンコールで
  • 間違った数学を来るかもしれません...))

しかし、私はそれを解決することができません。どんな助けでも大歓迎です。ありがとう!

+0

私は、結果をより明確にするために最初の投稿を編集しました。 –

+1

私はこれをチェックするコンピュータがありませんでしたが、最初のループでは、 'vecteps(i)= vecteps(i)+ eps'は非常に疑わしく見えます。おそらく '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> 

私は必ずあなたのコードのビルドと実行され、それが達成されれば作るためにこれを使用し、パッケージを作成することをお勧めします。

関連する問題