2013-06-26 20 views
6

Jeśli mieć tablicę Aodejmowania n wymiary K z tablicy macierzy n, k wymiary

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

a jeśli mają macierzy B

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

kod do odejmowania B z każdej macierzy tablicy A będzie:

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

Jednak jaki byłby kod do wykonywania tych samych obliczeń za pomocą funkcji z "a pply "rodzina?

Odpowiedz

8

To co sweep jest.

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

wielkie dzięki za te informacje –

+0

Jeszcze jedna potężna komenda o zupełnie nieintuicyjnym nazwisku (dla nie-statystyków) ... Uwielbiam R! Nazwa jest różna od "zastosuj". – smci

6

Może nie bardzo intuicyjny:

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

Tnx za cenną odpowiedź. Proszę, powiedz mi, co właściwie mówimy do R, zachowując A []? –

+2

Oznacza to przypisanie elementom "A" w nawiasach. Możesz pamiętać, że podczas indeksowania brakujący wymiar oznacza "wybierz wszystkie elementy w tym wymiarze", na przykład 'mat [1,]' oznacza "wybierz pierwszy wiersz i wszystkie kolumny macierzy' mat ". Ta konwencja obowiązuje również podczas indeksowania jednowymiarowego, więc '[]" oznacza "wybierz wszystkie elementy". To, co tu robi, polega na tym, że przypisuje je do 'A' _ zachowując jego wymiary w stanie nienaruszonym. Jest to konieczne, ponieważ 'apply' samo zwróci strukturę 2-wymiarową, podczas gdy my chcemy uzyskać wynik trójwymiarowy. –

+0

Wielkie wyjaśnienie, wielkie dzięki :) –

4

Ponieważ jesteś zapętlenie na ostatni wymiar tablicy, można po prostu zrobić:

d <- A - as.vector(B) 

i będzie to znacznie szybciej. Jest to ten sam pomysł, co w przypadku odjęcia wektora od matrycy: wektor jest poddawany recyklingowi, więc jest odejmowany w każdej kolumnie.

+0

+1 to jest niezły fakt. –

+0

Potrzebowałem pętli nad całymi wymiarami tablicy. Może wprowadziłem jakieś nieporozumienie, ponieważ w pierwszym poście napisałem set.seed (5) podając różnice liczbowe tylko dla ostatniego wymiaru tablicy. Jednak edytowałem post (np. Set.seed (i)) i prawdopodobnie uczynię to, co zamierzam, aby było bardziej intuicyjne i jasne. Jednak wielkie dzięki za odpowiedź! –

+0

@Newbie_R: Nie sądzę, że zdajesz sobie sprawę, że moja odpowiedź daje taki sam rezultat jak twój. – flodel

Powiązane problemy