Sto provando a prendere somme cumulative per ogni colonna di una matrice. Ecco il mio codice R:Somma cumulativa più veloce
testMatrix = matrix(1:65536, ncol=256);
microbenchmark(apply(testMatrix, 2, cumsum), times=100L);
Unit: milliseconds
expr min lq mean median uq max neval
apply(testMatrix, 2, cumsum) 1.599051 1.766112 2.329932 2.15326 2.221538 93.84911 10000
ho usato Rcpp per il confronto:
cppFunction('NumericMatrix apply_cumsum_col(NumericMatrix m) {
for (int j = 0; j < m.ncol(); ++j) {
for (int i = 1; i < m.nrow(); ++i) {
m(i, j) += m(i - 1, j);
}
}
return m;
}');
microbenchmark(apply_cumsum_col(testMatrix), times=10000L);
Unit: microseconds
expr min lq mean median uq max neval
apply_cumsum_col(testMatrix) 205.833 257.719 309.9949 265.986 276.534 96398.93 10000
Così il codice C++ è 7,5 volte più veloce. È possibile fare meglio di apply(testMatrix, 2, cumsum)
in puro R? Mi sembra di avere un ordine di grandezza sopra la testa senza motivo.
Si può provare a compilare tramite 'compile: cmpfun' e altri strumenti in quella libreria. Tuttavia, è risaputo che 'R', come' MATLAB' e lingue simili, ha un sacco di overhead dovuto alla 'compilazione' in fase di comando. Ecco perché le persone scrivono il coraggio delle funzioni in Fortran o cpp quando hanno bisogno della massima velocità. –
Alternativa veloce per 'apply (testMatrix, 2, cumsum)' è 'matrixStats :: colCumsums (testMatrix)'. – Khashaa
@ Khashaa, immagino che il tuo sia più veloce di R perché usa anche il codice C. Credo che l'autore stia chiedendo un'attuazione rigorosamente R. – cdeterman