Bir matrisin her bir sütunu için birikimli toplamları almaya çalışıyorum. İşte benim kod R var: Kümülatif toplam hızını daha hızlı yapın
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
Ben karşılaştırma için Rcpp kullandı:
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
Yani C++ kodu kadar hızlı 7,5 katıdır. Saf R içinde
apply(testMatrix, 2, cumsum)
'dan daha iyi yapmak mümkün mü? Hiçbir sebepten ötürü bir yükün büyüklüğüne sahip olduğumu hissettiriyor.
"Derleme: cmpfun" ve bu kitaplıktaki diğer araçlar aracılığıyla derlemeyi deneyebilirsiniz. Ancak, “MATLAB” ve benzeri diller gibi “R” nin komuta zamanında “derlenmesi” nedeniyle çok fazla yükü olduğu bilinmektedir. Bu yüzden insanlar maksimum hıza ihtiyaç duyduklarında Fortran veya cpp fonksiyonlarını bağırıyorlar. –
Uygula (testMatrix, 2, cumsum) için hızlı alternatif 'matrixStats :: colCumsums (testMatrix)' dır. – Khashaa
@Khashaa, C kodunun da kullanıldığından, sizin R'den daha hızlı olduğunu hayal ediyorum. Yazarın kesinlikle R uygulaması hakkında soru sorduğuna inanıyorum. – cdeterman