2013-07-30 13 views
5

szukam szybkiego obliczenia w badania śladu (trace (A)) macierzy A = B”C. Najszybszy sposób mogę myśleć jest następujący:Śledzenie macierzy krzyżowej - szybsze obliczenia?

set.seed(123) 
n <- 10^6 
B <- matrix(rnorm(n), ncol=sqrt(n)) 
C <- matrix(rnorm(n), ncol=sqrt(n)) 

ptm <- proc.time() 
A <- tcrossprod(B,C) 
traceA <- sum(diag(A)) 
proc.time() - ptm 

pytam siebie, jeśli istnieje szybszy sposób (zwłaszcza jeśli macierz B i macierz C są symetryczne, a nawet idempotentne). Chodzi mi o to, że z linią A <- tcrossprod(B,C) obliczam całą macierz A, chociaż potrzebuję tylko sumy diagonalnych elementów macierzy (trace (A)).

Aby przyspieszyć, pomyślałem o obliczeniach równoległych dla tcrossprod, ale nie znalazłem na to implementacji (nie wiem, czy to byłby dobry pomysł). Czy ktoś ma pomysł?

Odpowiedz

7

Tr (B'C) jest tylko wewnętrznym produktem macierzy B i C postrzeganych jako wektory. Tak więc w tym przykładzie robi się szybciej i jest o kilka rzędów wielkości szybsza.

+1

Okay dzięki! Zapomniałem wspomnieć, że w rzeczywistości mam rekursywne obliczenia dla macierzy A. Na przykład: A (k) = A (k-1) + crossprod (B, A (k-1)) '. I potrzebuję śladu 'A (k)' dla kroku 'k'. Więc jeśli użyję twojej sugestii: 'trace (A (k)) = suma (diag (A (k-1) + suma (A (k-1) * B)' ale bez znajomości pełnej macierzy 'A (k -1) ', śledzenia dla' A (k) 'nie można obliczyć, prawda? Myślę, że muszę edytować mój opis. – Giuseppe

Powiązane problemy