Hello! I have a program in Fortran and would like to build a matrix with random numbers, I have a function in C. However, I have problems with the use of function in R. Code to compile: R CMD SHLIB mat.f myrbeta.c -o func.so Code in C. #include <R.h> #include <Rmath.h> void F77_SUB(fseedi)(void){ GetRNGstate(); } void F77_SUB(fseedo)(void){ PutRNGstate(); } void F77_SUB(myrbeta)(double *px, double *pa, double *pb){ *px = rbeta(*pa,*pb); } Code in Fortran subroutine mat(x,l,c) integer l,c double precision x(l,c) integer i,j do j = 1, c do i = 1, l call fseedi() x(i,j) = call myrbeta(1,4,5) ! It's correct? call fseedo() enddo enddo end Thanks very much! -- Fábio Mathias Corrêa Estatística e Experimentação Agropecuária Fábio Mathias Corrêa UFLA ____________________________________________________________________________________ [[elided Yahoo spam]] [[alternative HTML version deleted]]
Hello! I have a program in Fortran and would like to build a matrix with random numbers, I have a function in C. However, I have problems with the use of function in R. Code to compile: R CMD SHLIB mat.f myrbeta.c -o func.so Code in C. #include <R.h> #include <Rmath.h> void F77_SUB(fseedi)(void){ GetRNGstate(); } void F77_SUB(fseedo)(void){ PutRNGstate(); } void F77_SUB(myrbeta)(double *px, double *pa, double *pb){ *px = rbeta(*pa,*pb); } Code in Fortran subroutine mat(x,l,c) integer l,c double precision x(l,c) integer i,j do j = 1, c do i = 1, l call fseedi() x(i,j) = call myrbeta(1,4,5) ! It''s correct? call fseedo() enddo enddo end The code of the error in R is: dyn.load("func.so") Error in dyn.load("func.so") : unable to load shared library ''/home/julio/Orientados/Fabio/Fortran/mat-fortran/func.so'': /home/julio/Orientados/Fabio/Fortran/mat-fortran/func.so: undefined symbol: callmyrbeta_ Thanks very much! Fábio Mathias Corrêa UFLA ____________________________________________________________________________________ [[elided Yahoo spam]] [[alternative HTML version deleted]]
Thanks Mr. Barry Rowlingson However, the matrix appears to zeros! Notice the code below! Please! Code in fortran subroutine mat(x,l,c,a) integer l,c double precision x(l,c), a integer i,j do j = 1, c do i = 1, l call fseedi() x(i,j) = myrbeta(a,1,2) call fseedo() enddo enddo end In R: dyn.load("func.so") x <- matrix(0,5,6) l <- nrow(x) c <- ncol(x) a <- 0 ..Fortran("mat", x = x, l, c, as.double(a)) Results: $x [,1] [,2] [,3] [,4] [,5] [,6] [1,] 0 0 0 0 0 0 [2,] 0 0 0 0 0 0 [3,] 0 0 0 0 0 0 [4,] 0 0 0 0 0 0 [5,] 0 0 0 0 0 0 [[2]] [1] 5 [[3]] [1] 6 [[4]] [1] 1 Thanks!!! Fábio Mathias Corrêa UFLA ____________________________________________________________________________________ [[elided Yahoo spam]] [[alternative HTML version deleted]]
Thanks very much! Fábio Mathias Corrêa UFLA --- Em qua, 1/7/09, Kjell Konis <kjell.konis@epfl.ch> escreveu: De: Kjell Konis <kjell.konis@epfl.ch> Assunto: Re: [Rd] Matrix with random number Para: "Fabio Mathias" <fabio.ufla@yahoo.com.br> Cc: r-devel@r-project.org Data: Quarta-feira, 1 de Julho de 2009, 8:30 Hi Fabio, Your function myrbeta returns void so assigning the output isn't going to work. Instead you need to call it like a FORTRAN subroutine. Also, I added arguments for the parameters of the beta and moved the fseedi and fseedo calls outside of the loop. This is a pretty basic FORTRAN programming question and there are lots of books that can help you learn FORTRAN. subroutine mat(x,l,c,pa,pb) integer l,c double precision x(l,c), a integer i,j call fseedi() do j = 1, c do i = 1, l call myrbeta(x(i,j),pa,pb) enddo enddo call fseedo() end In R call it like this: storage.mode(x) <- "double" ..Fortran("mat", x = x, as.integer(l), as.integer(c), as.double(1), as.double(2)) Cheers, Kjell On 30 juin 09, at 20:02, Fabio Mathias wrote:> Thanks Mr. Barry Rowlingson > > However, the matrix appears to zeros! > > Notice the code below! Please! > > Code in fortran > > subroutine mat(x,l,c,a) > integer l,c > double precision x(l,c), a > integer i,j > do j = 1, c > do i = 1, l > call fseedi() > x(i,j) = myrbeta(a,1,2) > call fseedo() > enddo > enddo > end > > In R: > > dyn.load("func.so") > x <- matrix(0,5,6) > l <- nrow(x) > c <- > ncol(x) > a <- 0 > > ..Fortran("mat", x = x, l, c, as.double(a)) > > Results: > > $x > [,1] [,2] [,3] [,4] [,5] [,6] > [1,] 0 0 0 0 0 0 > [2,] 0 0 0 0 0 0 > [3,] 0 0 0 0 0 0 > [4,] 0 0 0 0 0 0 > [5,] 0 0 0 0 0 0 > > [[2]] > [1] 5 > > [[3]] > [1] 6 > > [[4]] > [1] 1 > > > Thanks!!! > > > Fábio Mathias Corrêa UFLA > > > > > ____________________________________________________________________________________ > [[elided Yahoo spam]] > > [[alternative HTML version deleted]] > > <ATT00001.txt>____________________________________________________________________________________ [[elided Yahoo spam]] [[alternative HTML version deleted]]