2013-07-30 10 views
5

Sto cercando un calcolo veloce nella R della traccia (trace (A)) di una matrice A = B' C. Il modo più veloce che posso pensare è il seguente:Traccia di una matrice di crossproduct - un calcolo più veloce?

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 

chiedo me stesso se c'è un modo più veloce (specialmente se la matrice B e la matrice C sono simmetriche o addirittura idempotenti). Intendo con la linea A <- tcrossprod(B,C) Sto calcolando l'intera matrice A, anche se ho solo bisogno della somma degli elementi diagonali della matrice (traccia (A)).

Per accelerare, ho pensato a un calcolo parallelo per tcrossprod, ma non ho trovato un'implementazione per questo (inoltre non so se sarebbe una buona idea). Qualcuno ha un'idea?

risposta

7

Tr (B'C) è solo il prodotto interno delle matrici B e C visualizzate come vettori. Quindi

sum(B*C) 

fa il trucco ed è più veloce di diversi ordini di grandezza in questo esempio.

+1

Ok, grazie! Ho dimenticato di menzionare che in realtà ho un calcolo ricorsivo per la matrice A. Ad esempio: 'A (k) = A (k-1) + crossprod (B, A (k-1))'. E ho bisogno della traccia di 'A (k)' per il passo 'k'. Quindi se uso il tuo suggerimento: 'trace (A (k)) = sum (diag (A (k-1)) + sum (A (k-1) * B)' ma senza conoscere la matrice completa 'A (k -1) ', la traccia per' A (k) 'non può essere calcolata, giusto? Penso di dover modificare la mia descrizione. – Giuseppe