获取由矩阵式对象的每列中的最大值组成的向量的最快方法是什么?基础R中有apply(A, 2, max)
的更快替代方案吗?
?colSums
表示它“等同于使用FUN =具有适当边距的总和,但速度要快得多”。不幸的是,似乎没有colMax
。或者我错过了什么?
答案 0 :(得分:3)
您可以使用Rcpp
编写自己的c ++函数:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector colMaxRcpp(NumericMatrix X) {
int ncol = X.ncol();
Rcpp::NumericVector out(ncol);
for (int col = 0; col < ncol; col++){
out[col]=Rcpp::max(X(_, col));
}
return wrap(out);
}
这里有一些基准测试:
A <- matrix(rnorm(1e6),ncol=10000)
apply.max <- function(A) apply(A, 2, max)
identical(colMaxRcpp(A),apply.max(A))
[1] TRUE
library(microbenchmark)
microbenchmark(colMaxRcpp(A),apply.max(A),times=1)
Unit: milliseconds
expr min lq median uq max neval
colMaxRcpp(A) 11.57765 11.57765 11.57765 11.57765 11.57765 1
apply.max(A) 79.66040 79.66040 79.66040 79.66040 79.66040 1
编辑为矩阵30 * 30添加基准。 Rcpp的速度至少要快12倍。
A <- matrix(rnorm(30*30),ncol=30)
Unit: microseconds
expr min lq median uq max neval
colMaxRcpp(A) 13.274 14.033 15.1715 18.584 32.238 10
apply.max(A) 162.702 166.495 174.0805 189.251 1310.716 10