2013-11-28 119 views
0

獲得由矩陣狀對象的每列最大值組成的向量的最快方法是什麼?基地R中有apply(A, 2, max)更快的替代方案嗎?R中的列最大值

?colSums表示它「相當於使用適用於具有適當邊距的FUN = sum,但速度更快」。不幸的是,似乎沒有colMax。或者我錯過了什麼?

+0

matrix or data.frame? – flodel

+0

矩陣在我的具體情況 – Museful

+1

看看:http://stackoverflow.com/questions/7824912/max-and-min-functions-that-are-similar-to-colmeans – Chargaff

回答

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