2017-06-13 2 views
-1

Je voudrais parcourir des combinaisons d'éléments par paire dans une liste dans R, puis exécuter une fonction en utilisant la combinaison comme entrée.Application d'une fonction sur des combinaisons d'éléments dans une liste

Dans cet exemple minimal, I (1) définit trois matrices, (2) les combine en une liste contenant les matrices en tant qu'éléments, puis (3) calcule le produit scalaire des combinaisons des éléments dans le liste (matrice 1 contre matrice 2 et matrice 2 contre matrice 3).

set.seed 

m1 = as.matrix(replicate(2, rnorm(2))) 
m2 = as.matrix(replicate(2, rnorm(2))) 
m3 = as.matrix(replicate(2, rnorm(2))) 

matrix.list = list(m1, m2, m3) 

dot.prod = function(matrix.x, matrix.y){ 
    return(matrix.x %*% matrix.y) 
} 

Jusqu'à présent, je donne les résultats suivants pour avoir toutes les combinaisons de matrix.list comme entrées pour dot.prod() en utilisant une boucle imbriquée.

for (i in 1:length(matrix.list)){ 

    for (j in 1:length(matrix.list)){ 

      print(dot.prod(matrix.list[[i]], matrix.list[[j]])) 
    } 
} 

Est-il possible de le faire en utilisant une fonction combinatoire dans R (comme Combn())? Je serais très reconnaissant pour toute suggestion.

Edit: la fonction elle-même n'a pas d'importance - je veux savoir comment utiliser des combinaisons d'éléments d'une liste comme entrées pour toute fonction R

+1

Pourriez-vous donner un exemple reproductible (juste ajouter 'set.seed' au sommet) et le spectacle de la sortie désirée pour cet exemple? Il n'est pas tout à fait clair pour moi quelle structure vous voulez à la fin et quelle structure vous commencez avec. – lmo

Répondre

2

Faisons simplement

oo <- outer(matrix.list, matrix.list, Vectorize(crossprod, SIMPLIFY = FALSE)) 

qui vous donne une liste matricielle. L'accès au résultat est pratique. oo[1,2] (vraiment se plonger dans la liste oo[1,2][[1]]) donne le produit croisé entre la matrice 1 et de la matrice 2.

Remarque, la matrice produit croisé n'est pas %*% (mais si vous insistez, utilisez Vectorize("%*%", SIMPLIFY = FALSE)). Comme l'opération n'est pas symétrique, oo[1,2] est différent de oo[2,1].

Voir How to perform pairwise operation like `%in%` and set operations for a list of vectors pour l'idée originale de ceci.


Merci pour votre réponse. Pour clarifier: je veux calculer le produit scalaire, pas le produit croisé, comme je l'ai dit dans ma question initiale. Cependant, la fonction elle-même n'a pas d'importance - je veux savoir comment utiliser des combinaisons d'éléments d'une liste en tant qu'entrées pour n'importe quelle fonction R.

Aucune idée de ce que vous voulez. Donnez-vous quelques autres options et ramassez-vous. Ils sont tous différents.

Ceci?

combn(matrix.list, 2, function (u) u[[1]] %*% u[[2]]) 

Ce?

mapply("%*%", matrix.list[-length(matrix.list)], matrix.list[-1], SIMPLIFY = FALSE) 
+0

Merci pour votre réponse. Pour clarifier: je veux calculer le produit scalaire, pas le produit croisé, comme je l'ai dit dans ma question initiale. Cependant, la fonction elle-même n'a pas d'importance - je veux savoir comment utiliser des combinaisons d'éléments d'une liste en tant qu'entrées pour n'importe quelle fonction R. –