RcppArmadillo 中的向量化 log1p()

Vectorized log1p() in RcppArmadillo

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;
}

有没有更优雅的方法?

细节决定成败。

对于初学者来说,RcppArmadillo 没有 'Sugar' 所以你的推理是有缺陷的——你不能只看在 Rcpp::NumericVector.

上工作的 Rcpp Sugar 函数

话又说回来,你可以像你一样转换。但是您选择了昂贵的 转换。查看显式重用内存的高级构造函数——不需要副本。

一个更简单和更直接(但本地)的方法就是添加一个小的本地内联函数。这就是我会做的 :) 在几分钟内完成。

最后,我们有一些兄弟项目将 Rcpp Sugar 概括为可以采用迭代器的任何东西。那是 "the high road" 并且它可以做一些新的开发。也许开始 at this repo.

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

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

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

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