Créer une liste de matrices

Aller en bas

Créer une liste de matrices

Message par zezima le Mer 5 Avr 2017 - 15:24

Bonjour,

Je suis en train d'essayer de créer une liste de matrices automatique.

Il y a ce code manuel qui est utilisable :
Code:

a=list(matrix(,3,3),matrix(,3,3)),matrix(,3,3))
#Qui permet de créer une liste de 3 matrices les unes après les autres

Mais j'aimerais automatiser ce code pour créer 100 matrices les unes après les autres dans mon objet "a" sans avoir à écrire manuellement matrix(,3,3) 100 fois.

Quelqu'un aurait-il une idée ?

En vous remerciant d'avance.
avatar
zezima

Nombre de messages : 771
Date d'inscription : 26/02/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Créer une liste de matrices

Message par Eric Wajnberg le Jeu 6 Avr 2017 - 5:46

A la fin de la doc on-line de list, il y a l'exemple suivant, qui passe par la création d'un nouvel environnement:

Code:
e1 <- new.env()
e1$a <- 10
e1$b <- 20
as.list(e1)
Ca semble être la solution. Il suffit d'empiler tous les objets (matrices) dans ces sous-éléments de ce nouvel environnement, et d'en faire une liste à la fin.

HTH, Eric.
avatar
Eric Wajnberg

Nombre de messages : 820
Date d'inscription : 14/09/2012

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Créer une liste de matrices

Message par zezima le Jeu 6 Avr 2017 - 11:13

Bonjour, le code que tu as écrit m'a inspiré.

Ce code permet au final de réaliser automatiquement une liste de matrices (tout simple au final) :

Code:
for(i in 1:100){
a[[i]]=matrix(,3,3)
}

Bon il est temps que je me remette sur R Smile

Merci
avatar
zezima

Nombre de messages : 771
Date d'inscription : 26/02/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Créer une liste de matrices

Message par Nik le Jeu 6 Avr 2017 - 13:47

Bonjour,

Une liste de matrix carrées c'est surtout un array...Mois lourd à manipuler qu'une liste.

Donc
Code:
array(dim=c(3,3,100))
fera la même chose.

Sauf bien sûr si tu veux absolument une liste comme type d'ojet.

Nik

Nik

Nombre de messages : 1560
Date d'inscription : 23/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Créer une liste de matrices

Message par zezima le Jeu 6 Avr 2017 - 14:27

Merci, très intéressant ce code, je ne le connaissais pas.

Au final on obtient une liste de matrices avec ce code mais est-il possible d'avoir une liste de liste de matrices avec les "array" ?

Chose qui est possible avec les listes pour ce code

Code:
a=NULL;b=NULL
for(i in 1:3){
a[[i]]=matrix(c("D","I","X","L","A","P","I","N","S"),3,3)
b[[i]]=matrix(,3,3)
}
c=list(a,b);c

Mais si ça prend moins de place et que c'est moins volumineux, je suis complètement pour l'array.


Dernière édition par zezima le Ven 7 Avr 2017 - 10:53, édité 1 fois
avatar
zezima

Nombre de messages : 771
Date d'inscription : 26/02/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Créer une liste de matrices

Message par Nik le Ven 7 Avr 2017 - 6:51

Oui un array est à n dimensions. En 3D, c'est facile à se représenter les choses et du coup à choisir les dimensions à afficher pour retrouver sa matrice comme on la veut. Avec 4 dimensions ou plus c'est plus compliqué mais avec un peu de pratique on s'y fait très bien.
Tant que tes matrices à stocker sont des matrices carrées, tu as tout intérêt à utiliser un array quitte a le transformer en list via une fonction du type alply {plyr}.
En termes de place et d'efficacité de calcul, c'est comme utiliser un objet de type matrix à la place d'un data.frame car on est tout simplement dans la généralisation de ce cas à 3 dimensions ou plus.

Nik

Nik

Nombre de messages : 1560
Date d'inscription : 23/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Créer une liste de matrices

Message par Nik le Ven 7 Avr 2017 - 9:04

Il faut que j'ajoute un truc, par contre, un array c'est uniforme. Donc dès lors que tu as du character et du numeric en termes d'objet, tu es obligé de passer par le type list.

Nik

Nombre de messages : 1560
Date d'inscription : 23/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Créer une liste de matrices

Message par zezima le Ven 7 Avr 2017 - 10:12

Bonjour Nik et merci pour tes conseils.

Tu penses donc que c'est plus avantageux de faire une liste de plusieurs array plutôt qu'une liste de liste de matrices ?

Ce code serait plus optimal que le précédent que j'ai montré ?
Code:

c=NULL
for(i in 1:2){
c[[i]]=array(dim=c(2,2,3))
}
u

Merci
avatar
zezima

Nombre de messages : 771
Date d'inscription : 26/02/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Créer une liste de matrices

Message par Nik le Ven 7 Avr 2017 - 11:57

Si tu veux rentrer des natures de données différentes (character et numric par exemple), ça peut être un bon compromis. Tout dépend de ce que tu dois faire comme calcul.
Les listes c'est lourd en termes de calcul. Et ce, d'autant plus que tu augmente le nombre de niveau dans la liste.

Nik

Nombre de messages : 1560
Date d'inscription : 23/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Créer une liste de matrices

Message par zezima le Ven 7 Avr 2017 - 12:15

Merci,

D'accord donc il est possible de créer un array d'array ?

Je n'ai que des données numériques donc je peux en effet me passer de listes.
Mon seul but est d'avoir quelquechose qui ressemble à "une liste de plusieurs listes de matrices".

Et c'est justement à ce niveau-là que je ne sais pas comment faire pour translater l'équivalent de mon code sous format array. (au final avoir un array d'array)

Pensez-vous que c'est en pratique possible sous R ?
avatar
zezima

Nombre de messages : 771
Date d'inscription : 26/02/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Créer une liste de matrices

Message par Nik le Ven 7 Avr 2017 - 14:00

Par exemple :
Code:
listarray <- array(dim=c(3,3,100,10))
l'argument dim te donne les dimensions de l'array. Les 3 premières dimensions ça va être : nb de ligne, nb de colonnes et la profondeur. Dans l'exemple tu as donc un feuillet de 3 lignes et 3 colonnes qui est répété 100 fois dans la profondeur.
La 4e dimension, répète donc ce volume (3,3,100), n fois (10 fois dans l'exemple). Tu reproduis donc bien exactement ta liste d'array Et tu peux ajouter autant de dimensions que tu veux.

Pour reprendre ton vocabulaire, une matrice est déjà un array d'array puisqu'un vecteur est un array à 1 dimension. un array de matrices est un cube (empilement de matrices). Un array de cubes est un hypercube etc...etc...

En outre, la classe array permet d'extraire les données en croisant toutes les dimensions que tu veux. Ce n'est pas le cas avec une liste ou les éléments d'une liste ne peuvent pas toujours être extraits facilement dans la configuration que tu veux.

J'espère que je suis clair.

Nik

Nik

Nombre de messages : 1560
Date d'inscription : 23/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Créer une liste de matrices

Message par zezima le Ven 7 Avr 2017 - 14:16

Merci énormément, c'est très clair !

Je viens de percuter comment fonctionnait le code, c'est extrêmement puissant.
Plus rapide au niveau du code et optimisé au niveau de l'espace de stockage (si j'ai bien compris).

Merci, c'est exactement ce dont j'avais besoin, ça va être très utile pour les simulations.
avatar
zezima

Nombre de messages : 771
Date d'inscription : 26/02/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Créer une liste de matrices

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum