7
votes

Générer rapidement le produit cartésien d'une matrice

Disons que j'ai une matrice x qui contient 10 lignes et 2 colonnes. Je veux générer une nouvelle matrice m contenant chaque paire de lignes unique de x - c'est-à-dire une nouvelle matrice avec 55 lignes et 4 colonnes.

xxx

donc, x est: xxx

et ensuite m a 4 colonnes, les deux premières sont une ligne de x et les 2 suivantes sont une autre ligne de x : xxx

Y a-t-il un moyen plus rapide ou plus simple (ou à la fois plus simple de le faire dans R?


0 commentaires

5 Réponses :


3
votes

Je ne suis pas tout à fait grokking ce que vous faites, je vais simplement jeter quelque chose qui peut, ou peut ne pas aider.

Voici ce que je pense comme le produit cartésien des deux colonnes: xxx


1 commentaires

Jamais connu sur expand.Grid (). La réponse de Dirk apporte tout ensemble (comme toujours ...)



8
votes

Le expand.grid () fonction utile pour ceci: xxx

Vous avez maintenant les sous-ensembles 'N * (N + 1) / 2' et vous peut indexer simple votre matrice d'origine.


0 commentaires

2
votes

Vous pouvez également essayer le package "relations". Voici la vignette. Cela devrait fonctionner comme ceci :

relation_table(x %><% x)


0 commentaires

1
votes

Utilisation de la réponse de Dirk:

idx <- expand.grid(1:nrow(x), 1:nrow(x))
idx<-idx[idx[,1] >= idx[,2],]
N <- cbind(x[idx[,2],], x[idx[,1],])

> all(M == N)
[1] TRUE


0 commentaires

1
votes

Inspiré des autres réponses, voici une fonction mettant en œuvre des produits cartésiens de deux matrices, dans le cas de deux matrices, le produit cartésien complet, pour un seul argument, omettant une de chaque paire:

cartesian_prod <- function(M1, M2) {
if(missing(M2)) {  M2 <- M1
     ind  <- expand.grid(1:NROW(M1), 1:NROW(M2))
     ind <- ind[ind[,1] >= ind[,2],] } else {
                                          ind  <- expand.grid(1:NROW(M1), 1:NROW(M2))}
rbind(cbind(M1[ind[,1],], M2[ind[,2],]))


0 commentaires