# R中矩阵的快速子集

``````library(microbenchmark)
library(ref)

m0 <- matrix(rnorm(10^6), 10^3, 10^3)
r0 <- refdata(m0)
microbenchmark(m0[, 1:900], sum(m0[, 1:900]), sum(r0[,1:900]), sum(m0))
``````
``````Unit: milliseconds
expr       min        lq      mean    median        uq
m0[, 1:900] 10.087403 12.350751 16.697078 18.307475 19.054157
sum(m0[, 1:900]) 11.067583 13.341860 17.286514 19.123748 19.990661
sum(r0[, 1:900]) 11.066164 13.194244 16.869551 19.204434 20.004034
sum(m0)  1.015247  1.040574  1.059872  1.049513  1.067142
max neval
58.238217   100
25.664729   100
23.505308   100
1.233617   100
``````

F.私人

``````sum(colSums(m0)[1:900])
``````

``````#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double sumSub(const NumericMatrix& x,
const IntegerVector& colInd) {

double sum = 0;

for (IntegerVector::const_iterator it = colInd.begin(); it != colInd.end(); ++it) {
int j = *it - 1;
for (int i = 0; i < x.nrow(); i++) {
sum += x(i, j);
}
}

return sum;
}

microbenchmark(m0[, 1:900], sum(m0[, 1:900]), sum(r0[,1:900]), sum(m0),
sum(colSums(m0)[1:900]),
sumSub(m0, 1:900))
Unit: milliseconds
expr      min       lq     mean   median       uq       max neval
m0[, 1:900] 4.831616 5.447749 5.641096 5.675774 5.861052  6.418266   100
sum(m0[, 1:900]) 6.103985 6.475921 7.052001 6.723035 6.999226 37.085345   100
sum(r0[, 1:900]) 6.224850 6.449210 6.728681 6.705366 6.943689  7.565842   100
sum(m0) 1.110073 1.145906 1.175224 1.168696 1.197889  1.269589   100
sum(colSums(m0)[1:900]) 1.113834 1.141411 1.178913 1.168312 1.201827  1.408785   100
sumSub(m0, 1:900) 1.337188 1.368383 1.404744 1.390846 1.415434  2.459361   100
``````

0 条评论