RcppArmadillo中的向量化log1p()

时间:2018-11-07 03:23:07

标签: c++ rcpp armadillo

log1p()应用于整个arma::vec的适当方法是什么?似乎有log()exp()的向量化版本,但没有log1p()。我发现NumericVector有语法糖,因此我最终将arma::vec转换为NumericVector,应用log1p(),然后再转换回去:

#include <RcppArmadillo.h>

using namespace Rcpp;

// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
arma::vec test_log1p( arma::vec v )
{
  // arma::vec res = log1p(v);         // results in a compilation error
  NumericVector v1 = log1p( wrap(v) );
  arma::vec res = as<arma::vec>(v1);
  return res;
}

是否有更优雅的方法?

2 个答案:

答案 0 :(得分:4)

魔鬼再次出现在细节上。

对于初学者来说,RcppArmadillo没有'Sugar',因此您的推理存在缺陷-您不能只看一下0.0.0.0上正在使用的Rcpp Sugar函数。

然后,您可以像您一样进行转换。但是您选择了昂贵的转换。查看显式重用内存的高级构造函数-无需副本。

一种更简单,更直接的方法(但仍是本地方法)只是添加一些本地内联函数。那就是我要做的:)在几分钟内完成。

最后,我们有一些令人projects舌的项目,这些项目将Rcpp Sugar推广到可以使用迭代器的任何事物上。那是“主路”,它可以带来一些新的发展。也许开始at this repo

答案 1 :(得分:4)

使用可用于Armadillo向量和矩阵的.transform().for_each()工具。示例:

v.transform( [](double val) { return log1p(val); } );

v.for_each( [](double& val) { val = log1p(val); } );  // note the & character

您可能需要使用std前缀:std::log1p()而不是log1p()