【发布时间】:2016-10-30 00:29:37
【问题描述】:
我的主要目标是使用两组用于行和列的二进制向量来选择不连续的子矩阵。这是我使用 Rcpp、RcppArmadillo 和 RcppEigen 在 C++ 中实现的 MCMC 循环需要执行的众多步骤之一。
三种可能的方法是 (1) 使用 RcppArmadillo,(2) 从 Rcpp 调用我的 R 函数,以及 (3) 直接使用 R 并将结果传递给 C++。虽然最后一个选项对我来说一点都不方便。
然后我比较了这三种场景的性能速度。有趣的是,直接的 R 代码比其他两个要快得多!更令我惊讶的是,当我从 Rcpp 调用确切的 R 函数时,它比我直接从 R 调用它时慢得多。我希望那些运行速度与older post 中的示例中建议的运行速度相对相同.
无论如何,计时结果对我来说似乎有点奇怪。有什么原因吗?我使用带有 El Capitan OS、2.5 Ghz Intel Core i7 的 Macbook Pro。会不会与我的系统、Mac OSX 或我的机器上安装 Rcpp 的方式有关?
提前致谢!
代码如下:
CPP 部分:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// (1) Using RcppArmadillo functions:
// [[Rcpp::export]]
mat subselect(NumericMatrix X, uvec rows, uvec cols){
mat XX(X.begin(), X.nrow(),X.ncol(), false);
mat y = XX.submat(find(rows>0),find(cols>0));
return (y);
}
// (2) Calling the function from R:
// [[Rcpp::export]]
NumericalMatrix subselect2(NumericMatrix X, NumericVector rows, NumericVector cols){
Environment stats;
Function submat = stats["submat"];
NumericMatrix outmat=submat(X,rows,cols);
return(wrap(outmat));
}
R 部分:
library(microbenchmark)
# (3) My R function:
submat <- function(mat,rvec,cvec){
return(mat[as.logical(rvec),as.logical(cvec)])
}
# Comparing the performances:
// Generating data:
set.seed(432)
rows <- rbinom(1000,1,0.1)
cols <- rbinom(1000,1,0.1)
amat <- matrix(1:1e06,1000,1000)
//benchmarking:
microbenchmark(subselect(amat,rows,cols),
subselect2(amat,rows,cols),
submat(amat,rows,cols))
结果:
expr min lq mean median uq max neval
subselect(amat, rows, cols) 893.670 1566.882 2297.991 1675.282 2184.783 8462.142 100
subselect2(amat, rows, cols) 928.418 1581.553 3554.805 1657.454 2060.837 138801.050 100
submat(amat, rows, cols) 36.313 55.748 66.782 62.709 73.975 136.970 100
【问题讨论】:
-
我无法重现这些时间。针对 R 函数运行 Armadillo 函数,前者是 twice as fast on my machine。 请包含您对代码进行基准测试的数据。
-
有趣!我想知道在我的情况下发生了什么......对不起,我忘了包括我在基准测试中使用的数据。我刚刚包含在我上面的帖子中。请使用我的数据测试您得到的结果。
标签: r performance rcpp