"arraybind()"

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

"arraybind()"

Messagepar Stéphane Laurent » 28 Avr 2008, 09:16

Bonjour,

À l'instar de rbind() et cbind() qui empilent des vecteurs, je me demande s'il existe un moyen direct d'empiler des tableaux.

Par exemple si

Code : Tout sélectionner

> (M1=diag(2)); (M2=2*diag(2))
     [,1] [,2]
[1,]    1    0
[2,]    0    1
     [,1] [,2]
[1,]    2    0
[2,]    0    2


je voudrais une fonction "arraybind()" telle que arraybind(M1,M2)=

Code : Tout sélectionner

> array(cbind(M1,M2), dim=c(2,2,2))
, , 1

     [,1] [,2]
[1,]    1    0
[2,]    0    1

, , 2

     [,1] [,2]
[1,]    2    0
[2,]    0    2


Je souhaite aussi qu'on puisse empiler des empilages, c'est-à-dire que si

Code : Tout sélectionner

> (M3 <- 3*diag(2))
     [,1] [,2]
[1,]    3    0
[2,]    0    3


alors arraybind(arraybind(M1, M2), M3) serait égal à

Code : Tout sélectionner

> array(cbind(M1,M2,M3), dim=c(2,2,3))
, , 1

     [,1] [,2]
[1,]    1    0
[2,]    0    1

, , 2

     [,1] [,2]
[1,]    2    0
[2,]    0    2

, , 3

     [,1] [,2]
[1,]    3    0
[2,]    0    3


Y a-t-il une telle fonction implémentée dans R ?

Merci.

Logez Maxime
Messages : 3141
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 28 Avr 2008, 09:28

Bonjour,

regarde du côté de la librairie abind et de la fonction du même nom :
abind(abind(M1,M2,along=3),M3,along=3).

Maxime

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Messagepar Stéphane Laurent » 28 Avr 2008, 10:33

C'est exactement ça, merci.

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Messagepar Stéphane Laurent » 28 Avr 2008, 13:20

La fonction me semble terriblement lente!!!

Voyez cet exemple:

Code : Tout sélectionner

# génère une matrice 2x2 aléatoire
matrice <- function(){
   array(runif(4,0,1), dim=c(2,2))
}


## "empiler" N matrices aléatoires
N<- 10000

# 1ère méthode
S <- NULL
for(i in 1:N){
     S <- abind(S, matrice(), along=3)
}

# 2ème méthode
S <- array(NA, dim=c(2,2,N))
for(i in 1:N){
     S[,,i] <- matrice()
}

Logez Maxime
Messages : 3141
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 28 Avr 2008, 13:40

Re,


effectivement lorsque ces fonctions *bind sont utilisées de cette manière elles ne sont pas "performantes" (tu peux essayé le même genre de code avec la fonction cbind, pareil pour la fonction c). J'ai aussi envie de dire que dans le cas de cet exemple il n'y a pas nécessité à les utiliser puisque l'on connaît la taille de l'objet final et que tu aurais même pu générer S directement (S <- array(rnorm(2*2*10000),c(2,2,10000))).
Je pense que ces fonctions n'ont de sens uniquement lorsque tu veux joindre quelques arrays entre eux, du genre des données d'une provenance et des données provenant d'une deuxième source.
Après tout dépend ce que tu cherches à faire avec tes arrays.

Maxime

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Messagepar François Bonnot » 29 Avr 2008, 07:58

Bonjour,
Dans la méthode 1, ce n'est pas la fonction abind qui est longue, mais probablement la boucle. On peut utiliser abind avec le code suivant, moins rapide que la 2ème méthode mais quand-même acceptable:

Code : Tout sélectionner

# 3ème méthode
li <- lapply(1:N,function(i) matrice())
S <- abind(li,along=3)


FB

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Messagepar Stéphane Laurent » 29 Avr 2008, 08:45

Ok merci bien (mais cet exemple avec la matrice aléatoire était fictif)


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité