Fabio,
I see two problems with your code:
1. R type numeric corresponds to FORTRAN Real*8 (or double precision)
so that line 4 of your mat.f95 becomes:
REAL*8 :: x, y, res
2. your R code won't ever succeed because you pass integer matrices
(x,y,res) to a subroutine that expects REAL*8 data.
you need to coerce all your matrices to "double" as follows:
storage.mode(x) <- "double"
storage.mode(y) <- "double"
storage.mode(res) <- "double"
Finally, you can call the corrected function:
.Fortran("mymult", x,y,res,as.integer(l),as.integer(c))
[[1]]
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
[[2]]
[,1] [,2] [,3] [,4] [,5]
[1,] 20 16 12 8 4
[2,] 19 15 11 7 3
[3,] 18 14 10 6 2
[4,] 17 13 9 5 1
[[3]]
[,1] [,2] [,3] [,4] [,5]
[1,] 604 468 332 196 60
[2,] 678 526 374 222 70
[3,] 752 584 416 248 80
[4,] 826 642 458 274 90
[5,] 900 700 500 300 100
[[4]]
[1] 5
[[5]]
[1] 4
All these issues are discussed in the "Writing R Extensions" manual,
please read it carefully.
Ciao
Simone
On Wed, Aug 12, 2009 at 1:32 PM, Fabio Mathias
Corr?a<fabio.ufla at yahoo.com.br> wrote:> I am writing a function in fortran 95, but the intrinsic function MATMUL is
not working properly. Here's an example.
>
> ? ? ? ?SUBROUTINE mymult(x,y,res,m,n)
> ? ? ? ?IMPLICIT NONE
> ? ? ? ?INTEGER :: m,n
> ? ? ? ?REAL :: x, y, res
> ? ? ? ?DIMENSION :: x(m,n), y(n,m), res(m,m)
> ? ? ? ?res = MATMUL(x,y)
> ? ? ? ?END SUBROUTINE mymult
>
> R CMD SHLIB mat.f95
>
> In R:
>
> dyn.load("mat.so")
> x ? <- matrix(1:20,5)
> l ? <- nrow(x)
> c ? <- ncol(x)
> y ? <- matrix(20:1,c)
> res <- matrix(0,l,l)
> dim(x)
> dim(y)
> dim(res)
> l
> c
> .Fortran("mymult", x,y,res,l,c)
>
> [[1]]
> ? ? [,1] [,2] [,3] [,4]
> [1,] ? ?1 ? ?6 ? 11 ? 16
> [2,] ? ?2 ? ?7 ? 12 ? 17
> [3,] ? ?3 ? ?8 ? 13 ? 18
> [4,] ? ?4 ? ?9 ? 14 ? 19
> [5,] ? ?5 ? 10 ? 15 ? 20
>
> [[2]]
> ? ? [,1] [,2] [,3] [,4] [,5]
> [1,] ? 20 ? 16 ? 12 ? ?8 ? ?4
> [2,] ? 19 ? 15 ? 11 ? ?7 ? ?3
> [3,] ? 18 ? 14 ? 10 ? ?6 ? ?2
> [4,] ? 17 ? 13 ? ?9 ? ?5 ? ?1
>
> [[3]]
> ? ? [,1] [,2] [,3] [,4] [,5]
> [1,] ? ?0 ? ?0 ? ?0 ? ?0 ? ?0
> [2,] ? ?0 ? ?0 ? ?0 ? ?0 ? ?0
> [3,] ? ?0 ? ?0 ? ?0 ? ?0 ? ?0
> [4,] ? ?0 ? ?0 ? ?0 ? ?0 ? ?0
> [5,] ? ?0 ? ?0 ? ?0 ? ?0 ? ?0
>
> [[4]]
> [1] 5
>
> [[5]]
> [1] 4
>
>
> Linux Ubuntu 8.04 and use compiler gfortran 4.2.
> The problem is the compiler?
>
> Thanks!
>
> ? ???????????? F?bio Mathias Corr?a
> Estat?stica e Experimenta??o Agropecu?ria/UFLA
> ? ? ? ? ? ? ? ? ? ? ?Brazil
>
>
> ? ?
?____________________________________________________________________________________
> Veja quais s?o os assuntos do momento no Yahoo! +Buscados
> http://br.maisbuscados.yahoo.com
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
--
______________________________________________________
Simone Giannerini
Dipartimento di Scienze Statistiche "Paolo Fortunati"
Universita' di Bologna
Via delle belle arti 41 - 40126 Bologna, ITALY
Tel: +39 051 2098262 Fax: +39 051 232153
http://www2.stat.unibo.it/giannerini/