2013-06-26 13 views
6

Wenn ich ein Array haben eineSubtract Matrix von n, k Dimensionen von Array von Matrizen von n, k Dimensionen

A <- array(0, c(4, 3, 5)) 
for(i in 1:5) { 
    set.seed(i) 
    A[, , i] <- matrix(rnorm(12), 4, 3) 
} 

und wenn ich Matrix B

set.seed(6) 
B <- matrix(rnorm(12), 4, 3) 

Der Code B zu subtrahieren von der jede Matrix der Matrix A wäre:

d<-array(0, c(4,3,5)) 
for(i in 1:5){ 
    d[,,i]<-A[,,i]-B 
} 

jedoch, was der Code wäre, die gleiche Berechnung unter Verwendung einer Funktion von „a auszuführen pled "Familie?

Antwort

8

Dies ist, was sweep für ist.

sweep(A, 1:2, B) 
+0

vielen Dank für diese Info –

+0

Noch ein mächtiger Befehl mit einem völlig nicht intuitiven Namen (für Nicht-Statistiker) ... Ich liebe R! Der Name unterscheidet sich von "anwenden". – smci

6

Vielleicht nicht sehr intuitiv:

A[] <- apply(A, 3, `-`, B) 
+0

Tnx für wertvolle Antwort. Bitte, sagen Sie mir, was wir R sagen, zu tun, während wir die A [] behalten? –

+2

Es bedeutet, in die Elemente von "A" innerhalb der Klammern zuzuweisen. Sie können sich daran erinnern, dass eine fehlende Dimension beim Indexieren bedeutet "alle Elemente in dieser Dimension auswählen", zum Beispiel bedeutet "mat [1,]" "wählen Sie die erste Zeile und alle Spalten der Matrix' mat' "aus. Diese Konvention gilt auch für die eindimensionale Indexierung, also bedeutet "[]" "Alle Elemente auswählen". Was es hier tut, ist, dass es in "A" ordnet, während seine Maße intakt bleiben. Dies ist hier notwendig, weil 'apply 'selbst eine 2-dimensionale Struktur zurückgibt, während wir ein 3-dimensionales Ergebnis wollen. –

+0

Tolle Erklärung, vielen Dank :) –

4

Weil Sie auf der letzten Array-Dimension sind Looping, können Sie einfach tun:

d <- A - as.vector(B) 

und es wird viel schneller sein. Es ist die gleiche Idee wie wenn Sie einen Vektor von einer Matrix subtrahieren: Der Vektor wird recycelt, so dass er von jeder Spalte subtrahiert wird.

+0

+1 das ist eine nette Tatsache –

+0

Ich musste über die gesamten Dimensionen des Arrays Schleife. Vielleicht habe ich einige Missverständnisse eingeführt, weil ich im ersten Beitrag set.seed (5) geschrieben habe, was nur für die letzte Dimension des Arrays numerische Unterschiede ergab. Allerdings habe ich den Post bearbeitet (z. B. set.seed (i)) und mache wahrscheinlich das, was ich tun soll, intuitiver und klarer. Vielen Dank für die Antwort! –

+0

@Newbie_R: Ich glaube nicht, dass Sie erkennen, dass meine Antwort das gleiche Ergebnis wie Ihre gibt. – flodel

Verwandte Themen