簡體   English   中英

如何使用Rcpp將lgamma應用於矩陣(會更快)?

[英]How to apply lgamma to a matrix using Rcpp (and will it be faster)?

我想知道是否可以使用Rcpp將lgamma應用於大型矩陣的所有條目。 我嘗試使用向量:

// lgammaRcpp.cpp
#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector lgammaRcpp(NumericVector v){
    NumericVector out;
    out = lgamma(v);
    return(out);
}

我做了一個簡單的微基准測試:

library("microbenchmark")
x <- round(runif(100000)+50000);
microbenchmark(
   lgammaRcpp(x),
   lgamma(x)
)

並且Rcpp稍快一些:

Unit: milliseconds
          expr      min       lq     mean   median       uq      max neval
 lgammaRcpp(x) 5.405556 5.416283 5.810254 5.436139 5.511993 8.650419   100    
     lgamma(x) 5.613717 5.628769 6.114942 5.644215 6.872677 9.947497   100

但是,當我嘗試使用“ NumericMatrix”時:

// [[Rcpp::export]]
NumericMatrix lgammaRcpp(NumericMatrix v){
    NumericMatrix out;
    out = lgamma(v);
    return(out);
}

有我不明白的錯誤,例如

/home/canghel/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include/Rcpp/vector   /Matrix.h:83:13: note: Rcpp::Matrix<RTYPE, StoragePolicy>& Rcpp::Matrix<RTYPE, StoragePolicy>::operator=(const Rcpp::Matrix<RTYPE, StoragePolicy>&) [with int RTYPE = 14; StoragePolicy = Rcpp::PreserveStorage]
 Matrix& operator=(const Matrix& other) {

我的問題是:1)是否可以修改我的函數以將lgamma應用於矩陣的所有條目? 和2)值得嗎?還是為lgamma函數調用的基礎庫對於C ++和R是否相同?

使用Rfast包將lgamma / digamma之類的函數應用於矩陣似乎更好(即更快)。

library("microbenchmark");
library("RcppArmadillo");
library("Rfast");
sourceCpp("lgammaRcpp.cpp");

x <- matrix(round(runif(100000)+50000), 100, 1000);
microbenchmark(
    lgammaRcpp(x),
    lgamma(x),
    Rfast::Lgamma(x)
)
Unit: milliseconds
          expr      min       lq     mean   median       uq      max neval
lgammaRcppArma(x) 4.654526 4.919831 5.577843 5.413790 5.888895 9.258325   100
lgamma(x) 5.572671 5.840268 6.582007 6.131651 7.280895 8.779301   100
Rfast::Lgamma(x) 4.450824 4.588596 5.128323 4.791287 5.608678 6.865331   100

我在哪里:

#include<RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
arma::mat lgammaRcpp(arma::mat m) {
    arma::mat out = lgamma(m);
    return(out);
}
  1. 除非另有說明,否則Rcpp Sugar傾向於返回Vector。 因此,在這種情況下,您總是會得到Numeric類型的Vector ,例如NumericVector 在這里查看關於不同糖功能的注釋: https : //github.com/coatless/rcpp-api

以下允許在上述注釋下進行編譯:

#include <Rcpp.h>

// [[Rcpp::export]]
NumericVector lgammaRcpp(NumericMatrix v) { 
    NumericVector out;
    out = lgamma(v);
    return(out);
}
  1. 由於所使用的功能相同,因此您極不可能看到大幅提高速度。 您的上述基准測試部分地表明了這一點,可以通過查看Rcpp Math定義進行驗證。 現在,這並不是說沒有好處。 特別是,這里的主要好處是,如果您完全用C ++封裝例程。 在這種情況下,與從C ++調用R函數相比,如果您使用Sugar函數,則例程將明顯更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM