Tôi đang cố gắng lấy tổng tích lũy cho mỗi cột của ma trận. Dưới đây là mã của tôi trong R:Thực hiện tổng tích luỹ nhanh hơ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
tôi đã sử dụng Rcpp để so sánh:
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
Vì vậy, cáC++ mã C là 7,5 lần càng nhanh. Có thể làm tốt hơn apply(testMatrix, 2, cumsum)
trong R thuần túy không? Nó cảm thấy như tôi có một thứ tự của cường độ trên không vì lý do nào.
Bạn có thể thử biên dịch thông qua 'biên dịch: cmpfun' và các công cụ khác trong thư viện đó. Tuy nhiên, nó nổi tiếng là 'R', giống như' MATLAB' và các ngôn ngữ tương tự, có rất nhiều chi phí do 'biên dịch' tại thời gian lệnh. Đó là lý do tại sao mọi người viết ruột của các chức năng trong Fortran hoặc cpp khi họ cần tốc độ tối đa. –
Thay thế nhanh cho 'áp dụng (testMatrix, 2, cumsum)' là 'matrixStats :: colCumsums (testMatrix)'. – Khashaa
@ Khashaa, tôi tưởng tượng bạn nhanh hơn R vì nó cũng đang sử dụng mã C. Tôi tin rằng tác giả đang hỏi về việc thực hiện nghiêm chỉnh R. – cdeterman