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?
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