Ho bisogno di calcolare la media di ogni elemento fuori diagonale in una matrice n × n. I triangoli inferiore e superiore sono ridondanti. Ecco il codice che sto usando:Modo più rapido di calcolare le medie fuori diagonale nelle grandi matrici
A <- replicate(500, rnorm(500))
sapply(1:(nrow(A)-1), function(x) mean(A[row(A) == (col(A) - x)]))
Quale sembra funzionare ma non si adatta bene con matrici più grandi. Quelli che ho non sono enormi, circa 2-5.000^2, ma anche con il 1000^2 si sta prendendo più di quanto mi piacerebbe:
A <- replicate(1000, rnorm(1000))
system.time(sapply(1:(nrow(A)-1), function(x) mean(A[row(A) == (col(A) - x)])))
> user system elapsed
> 26.662 4.846 31.494
C'è un modo più intelligente di fare questo?
modifica Per chiarire, mi piacerebbe la media di ciascuna diagonale indipendentemente, ad es. per:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
Vorrei:
mean(c(1,2,3))
mean(c(1,2))
mean(1)
Bel uso di indici. Voterò per questo come risposta accettata, in quanto illustra quanto possano essere potenti indici. –
Grazie, ma il tuo è molto più chiaro, @JorisMeys; questo approccio varrebbe la complicazione extra solo se è qualcosa che devi fare un _lot_ e ogni decimo di secondo annunci. –
È molto intelligente: ho dovuto lavorare attraverso la generazione di indici per capire cosa stava succedendo. Grazie per la risposta – blmoore