Ich versuche kumulative Summen für jede Spalte einer Matrix zu nehmen. Hier ist mein Code in R:Machen kumulative Summe schneller
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
I verwendet RCPP zum Vergleich:
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
So ist der C++ Code 7,5 mal so schnell. Ist es möglich, besser als apply(testMatrix, 2, cumsum)
in reinem R zu tun? Es fühlt sich an, als hätte ich eine Größenordnung ohne jeden Grund.
Sie könnten versuchen, kompilieren über 'compile: cmfun' und andere Tools in dieser Bibliothek. Es ist jedoch bekannt, dass 'R', wie' MATLAB' und ähnliche Sprachen, aufgrund des "Kompilierens" zur Befehlszeit viel Overhead haben. Deshalb schreiben die Leute den Kern der Funktionen in Fortran oder cpp, wenn sie maximale Geschwindigkeit benötigen. –
Schnelle Alternative für 'apply (testMatrix, 2, cumsum)' ist 'matrixStats :: colCumsums (testMatrix)'. – Khashaa
@Khashaa, ich denke, Ihre ist schneller als R, weil es auch C-Code verwendet. Ich glaube, der Autor fragt nach einer streng R-Implementierung. – cdeterman