Chapitre 6. Programmation en R
271
Vous pouvez ensuite utiliser le code C/C++ pr´ ec´ edent depuis R de la fa¸ con
suivante. Commencez par sauver le code suivant dans un fichier nomm´ e inv.R :
> inv <- function(M) {
+ n <- nrow(M)
+ return(matrix(.C("invC",Minv=as.vector(M),n)$Minv,nrow=n,ncol=n))
+ }
Puis lancez les instructions :
> dyn.load(paste("inv",.Platform$dynlib.ext,sep=""))
> A <- matrix(rnorm(9),nrow=3)
> solve(A) # La fonction R solve() permet le calcul
# de l’inverse d’une matrice.
[,1]
[,2]
[,3]
[1,] -5.3289747 -6.6112370 -7.7277894
[2,] 1.5293527 2.6146603 2.0573112
[3,] 0.5656936 0.1808586 -0.4919597
> inv(A)
[,1]
[,2]
[,3]
[1,] -5.3289747 -6.6112370 -7.7277894
[2,] 1.5293527 2.6146603 2.0573112
[3,] 0.5656936 0.1808586 -0.4919597
Les deux fonctions solve() et inv() permettent donc d’obtenir le mˆ eme
r´ esultat pour ce qui est de l’inversion d’une matrice. On peut voir ci-dessous
que le gain en temps de calcul pour cette seule op´ eration est appr´ eciable.
> require("rbenchmark")
> benchmark(Rcode=solve(A),Ccode=inv(A),replications=100000)
test replications elapsed relative user.self sys.self
2 Ccode
100000
1.078
1.000
1.052
0.032
1 Rcode
100000
2.765
2.565
2.692
0.092
user.child sys.child
2
0
0
1
0
0
6.5.3.3 Les librairies BLAS et LAPACK
Les librairies BLAS (Basic Linear Algebra Subprograms) et LAPACK (Linear
Algebra PACKage) sont des librairies Fortran permettant d’effectuer de nombreuses op´ erations matricielles. Nous allons voir sur un exemple simple comment les utiliser.
Commencez par installer le logiciel de (d´ e)compression 7-zip disponible
` a l’adresse http://www.7-zip.org/download.html. Utilisez ce logiciel (deux
fois) pour d´ ecompresser (en deux ´ etapes) le fichier http://www.netlib.org/
lapack/lapack.tgz. Tous les fichiers et sous-dossiers obtenus (BLAS, CMAKE,
etc.) devront ˆ etre plac´ es directement dans un dossier nomm´ e C:\lapack. Ce
271
Vous pouvez ensuite utiliser le code C/C++ pr´ ec´ edent depuis R de la fa¸ con
suivante. Commencez par sauver le code suivant dans un fichier nomm´ e inv.R :
> inv <- function(M) {
+ n <- nrow(M)
+ return(matrix(.C("invC",Minv=as.vector(M),n)$Minv,nrow=n,ncol=n))
+ }
Puis lancez les instructions :
> dyn.load(paste("inv",.Platform$dynlib.ext,sep=""))
> A <- matrix(rnorm(9),nrow=3)
> solve(A) # La fonction R solve() permet le calcul
# de l’inverse d’une matrice.
[,1]
[,2]
[,3]
[1,] -5.3289747 -6.6112370 -7.7277894
[2,] 1.5293527 2.6146603 2.0573112
[3,] 0.5656936 0.1808586 -0.4919597
> inv(A)
[,1]
[,2]
[,3]
[1,] -5.3289747 -6.6112370 -7.7277894
[2,] 1.5293527 2.6146603 2.0573112
[3,] 0.5656936 0.1808586 -0.4919597
Les deux fonctions solve() et inv() permettent donc d’obtenir le mˆ eme
r´ esultat pour ce qui est de l’inversion d’une matrice. On peut voir ci-dessous
que le gain en temps de calcul pour cette seule op´ eration est appr´ eciable.
> require("rbenchmark")
> benchmark(Rcode=solve(A),Ccode=inv(A),replications=100000)
test replications elapsed relative user.self sys.self
2 Ccode
100000
1.078
1.000
1.052
0.032
1 Rcode
100000
2.765
2.565
2.692
0.092
user.child sys.child
2
0
0
1
0
0
6.5.3.3 Les librairies BLAS et LAPACK
Les librairies BLAS (Basic Linear Algebra Subprograms) et LAPACK (Linear
Algebra PACKage) sont des librairies Fortran permettant d’effectuer de nombreuses op´ erations matricielles. Nous allons voir sur un exemple simple comment les utiliser.
Commencez par installer le logiciel de (d´ e)compression 7-zip disponible
` a l’adresse http://www.7-zip.org/download.html. Utilisez ce logiciel (deux
fois) pour d´ ecompresser (en deux ´ etapes) le fichier http://www.netlib.org/
lapack/lapack.tgz. Tous les fichiers et sous-dossiers obtenus (BLAS, CMAKE,
etc.) devront ˆ etre plac´ es directement dans un dossier nomm´ e C:\lapack. Ce
