2017-06-13 2 views
-1

Ich möchte paarweise Kombinationen von Elementen in einer Liste in R durchlaufen und dann eine Funktion ausführen, die die Kombination als Eingabe verwendet.Anwenden einer Funktion über Kombinationen von Elementen in einer Liste

In diesem minimalen Beispiel definiere ich (1) drei Matrizen, (2) kombiniere sie zu einer Liste, die die Matrizen als Elemente enthält, und dann (3) möchte ich das Skalarprodukt der Kombinationen der Elemente in der Liste (dh Matrix 1 gegenüber Matrix 2 und Matrix 2 gegenüber Matrix 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) 
} 

Bisher habe ich die alle Kombinationen von matrix.list als Eingänge für dot.prod haben folgende() eine verschachtelte Schleife.

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

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

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

Ist es möglich, dies mithilfe einer kombinatorischen Funktion in R (wie combn()) zu tun? Für Vorschläge wäre ich sehr dankbar.

Edit: die Funktion selbst spielt keine Rolle - ich möchte wissen, wie Kombinationen von Elementen aus einer Liste als Eingänge für jede R-Funktion

+1

Könnten Sie ein reproduzierbares Beispiel liefern (fügen Sie einfach 'set.seed' nach oben) und die Show die gewünschte Ausgabe für dieses Beispiel? Es ist mir nicht ganz klar, welche Struktur du am Ende haben willst und mit welcher Struktur du beginnst. – lmo

Antwort

2

wir

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

nur tun verwenden, die Sie gibt eine Matrixliste. Zugriff auf das Ergebnis ist praktisch. oo[1,2] (tatsächlich in die Liste erhalten oo[1,2][[1]]) ergibt das Kreuzprodukt zwischen Matrix 1 und Matrix 2.

Hinweis, Matrix Kreuzprodukt ist nicht %*% (aber wenn Sie darauf bestehen, verwendet Vectorize("%*%", SIMPLIFY = FALSE)). Da die Operation nicht symmetrisch ist, unterscheidet sich oo[1,2] von oo[2,1].

Siehe How to perform pairwise operation like `%in%` and set operations for a list of vectors für die ursprüngliche Idee von diesem.


Vielen Dank für Ihre Antwort. Zur Verdeutlichung: Ich möchte das Skalarprodukt, nicht das Kreuzprodukt berechnen, wie ich in meiner Ausgangsfrage angegeben habe. Allerdings spielt die Funktion selbst keine Rolle - ich möchte wissen, wie man Kombinationen von Elementen aus einer Liste als Eingaben für irgendeine R-Funktion verwendet.

Keine Ahnung, was Sie wollen. Geben Sie ein paar andere Optionen und holen Sie sich selbst auf. Sie sind alle verschieden.

Dies?

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

This?

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

Danke für Ihre Antwort. Zur Verdeutlichung: Ich möchte das Skalarprodukt, nicht das Kreuzprodukt berechnen, wie ich in meiner Ausgangsfrage angegeben habe. Allerdings spielt die Funktion selbst keine Rolle - ich möchte wissen, wie man Kombinationen von Elementen aus einer Liste als Eingaben für irgendeine R-Funktion verwendet. –

Verwandte Themen