Я пытаюсь эффективно вычислить rowMaxs в R cpp. Очень простая реализация -
arma::mat RcppRowmaxs(arma::mat x){
int N = x.n_rows;
arma::mat rm(N,1);
for(int nn = 0; nn < N; nn++){
rm(nn) = max(x.row(nn));
}
return(rm);
}
, которая прекрасно работает. Однако, сравнивая эту функцию с другими пакетами, оказалось, что другие реализации гораздо более эффективны. В частности, Rfast::rowMaxs
более чем в 6 раз быстрее, чем простая реализация R cpp!
Естественно, я пытался имитировать c поведение Rfast
. Однако, как новичок в R cpp, я только пытался загрузить Rfast::rowMaxs
непосредственно в R cpp, как описано, например, здесь . К сожалению, использование скрипта R cpp для загрузки функции R, которая снова вызывает скрипт R cpp, кажется довольно медленным после моего теста (см. Строку «RfastinR cpp»):
m = matrix(rnorm(1000*1000),1000,1000)
microbenchmark::microbenchmark(
matrixStats = matrixStats::rowMaxs(m),
Rfast = Rfast::rowMaxs(m,value=T),
Rcpp = RcppRowmaxs(m),
RfastinRcpp = RfastRcpp(m),
apply = apply(m,1,max)
)
Unit: microseconds
expr min lq mean median uq max neval cld
matrixStats 1929.570 2042.8975 2232.1980 2086.5180 2175.470 4025.923 100 a
Rfast 666.711 727.2245 842.5578 795.2215 891.443 1477.969 100 a
Rcpp 5552.216 5825.4855 6186.9850 5997.8295 6373.737 8568.878 100 b
RfastinRcpp 7495.042 7931.2480 9471.8453 8382.6350 10659.672 19968.817 100 b
apply 12281.758 15145.7495 22015.2798 17202.9730 20310.939 136844.591 100 c
Любой Советы о том, как улучшить производительность в функции, которую я предоставил выше? Я посмотрел на исходный код Rfast
и считаю, что этот является правильным файлом. Однако до сих пор мне не удалось найти важные части кода.
Редактировать: теперь пост изменен, чтобы сосредоточиться на Rfast
, после ответа Михаила.