2016-06-13 3 views
5

Mein Problem ist im Grunde diese:ein Element einer Liste gegeben, wie kann ich wieder in der Liste seinen Index?

ich eine Liste, L haben, wobei jedes Element eine Matrix mit der gleichen Dimension ist. Ich brauche jede Matrix innerhalb dieser Liste mit seinem entsprechenden Elemente in einem Außen Vektor h zu multiplizieren, und dann alle Matrizen summiert.

set.seed(101) 
L <- replicate(3,matrix(rnorm(4),2),simplify=FALSE) 
h <- 2:4 

# I need this 
L[[1]]*h[1] + L[[2]]*h[2] +L[[3]]*h[3] 

Da ich mit einer unterschiedlichen Anzahl von Matrizen experimentieren muß, und ich habe ein paar von ihnen, ich habe es auf intelligente Weise zu tun. Meine Idee war,

L1 <- lapply(L, function(x) x*h[x]) 
L2 <- Reduce('+', L1) 

Wo "h [x]" würde den Vektor h durch den Index der Matrix x in der Liste L werden die Indizierung, also würde ich also

L1 = list(L[[1]]*h[1], L[[2]]*h[2], L[[3]]*h[3]) 

bekommen, ist die Frage ist, wie bekomme ich den Index eines Elements in einer Liste, indem ich das Element selbst benutze? Etwas wie h [L [[m1]]] um h [1] zu bekommen.

Oder, wenn Sie irgendeine andere Art und Weise habe mein Problem zu lösen, wie mache ich das?

+1

Könnten Sie das Beispiel Ergänzen Beispiel Matrizen m1 geben, m2, m3? – Frank

+0

das unten von Ben Bolker angegebene Beispiel funktioniert –

Antwort

6

Ich glaube, du bist für mapply()/Map() suchen (Map ist etwas einfacher, weil es hier die Ergebnisse nicht versuchen zu vereinfachen):

?Map:

‚Karte‘ wendet eine Funktion zu den entsprechenden Elementen der gegebenen Vektoren ... ‚Karte‘ ist ein einfaches wrapper ‚mapply‘ auf der das Ergebnis nicht zur Vereinfachung nicht versuchen, ...

?mapply:

'mapply' gilt 'FUN' an die ersten Elemente jedes Argument ..., die das zweite Element, der dritten Elemente und so weiter

Einrichten Beispiel:

set.seed(101) 
L <- replicate(3,matrix(rnorm(4),2),simplify=FALSE) 
h <- 2:4 

do it:

Reduce("+",Map("*",L,h)) 
2

Mit dem foreach Paket, wir das Ergebnis bekommen können wie folgt:

library(foreach) 
foreach(i=seq_along(h), .combine="+") %do% { 
    L[[i]] * h[i] 
} 

Die %do% Schleife läuft durch das Element weise Multiplikation durchgeführt wird, dann summiert die Ausgabe den .combine Argument. Dies gibt das gleiche Ergebnis wie Bens Map-Reduce Methode.

Verwandte Themen